2015-10-07 17 views
6

Đây là mẫu của tôi:DjangoRestFramework - Bỏ qua các lĩnh vực null khi serializing đối tượng

class Post(models.Model): 
    user = models.ForeignKey(User) 
    post = models.CharField(max_length=400) 
    country = models.ForeignKey(Country, blank=True, null=True) 

và đây là serializer tôi:

class PostSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Post 
     fields = ('user', 'post', 'country',) 

    def create(self, validated_data): 
     post = Post(
       user = User.objects.get(username='MyUser'), 
       post = validated_data['post'], 
     ) 

     if validated_data.get('country', None): 
      post.country = validated_data['country'] 

     return post 

Có cách nào cho tôi để nói DRF rằng nếu giá trị của trường là null (vì trường 'country' là tùy chọn và đôi khi không được cung cấp), sau đó bỏ qua nó và chỉ cần tuần tự hóa các dữ liệu khác? Hoặc ít nhất là tuần tự hóa nó với một giá trị của Không?

Tôi không nghĩ mình có thể sử dụng SerializerMethodField (http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield) vì trường 'quốc gia' không phải là trường chỉ đọc (tôi cũng viết quá, nếu nó được cung cấp).

Tôi về cơ bản muốn bỏ qua trường (hoặc ít nhất là làm cho giá trị None) khi tuần tự hóa một đối tượng Nếu trường là null.

Trả lời

3

Tính đến DRF 3.2.4, chừng nào bạn thêm

blank=True 

đến lĩnh vực mô hình như vậy:

class Post(models.Model): 
    country = models.ForeignKey(Country, blank=True) 

sau đó DRF sẽ đối xử với lĩnh vực này là tùy chọn khi tuần tự và deserializing nó (Lưu ý rằng mặc dù nếu không có null = Đúng vào lĩnh vực người mẫu, sau đó Django sẽ nâng cao một lỗi nếu bạn cố gắng s ave một đối tượng vào cơ sở dữ liệu mà không cung cấp trường).

Xem câu trả lời vào đây để biết thêm thông tin: DjangoRestFramework - correct way to add "required = false" to a ModelSerializer field?

Nếu bạn đang sử dụng trước DRF 3.2.4, sau đó bạn có thể ghi đè lĩnh vực này trong serializer và thêm yêu cầu = False để nó. Xem tài liệu vào đây để biết thêm thông tin về quy định cụ thể hoặc trọng lĩnh vực rõ ràng mới: http://www.django-rest-framework.org/api-guide/serializers/#specifying-fields-explicitly

Vì vậy, một cái gì đó như thế này (Lưu ý rằng tôi đã không kiểm tra đầy đủ các mã dưới đây nhưng nó phải là một cái gì đó dọc theo những dòng):

class PostSerializer(serializers.ModelSerializer): 
    country = serializers.PrimaryKeyRelatedField(required=False) 
    class Meta: 
     model = Post 
     fields = ('user', 'post', 'country',) 
2

chủ đề này có thể có ích:

https://stackoverflow.com/a/28870066/4698253

Nó cơ bản nói rằng bạn có thể ghi đè lên các chức năng to_representation() với một sửa đổi nhỏ.

tôi sẽ đặt này trong các ý kiến ​​nhưng tôi không có đủ điểm chưa :(

Các vấn đề liên quan