【问题标题】:How to access Other Model Field from Serializer related Field?如何从序列化器相关字段访问其他模型字段?
【发布时间】:2021-08-14 11:06:47
【问题描述】:

有以下型号

class Search(models.Model):
   trip_choice = (
        ('O', 'One way'),
        ('R', 'return')
    )
    booking_id = models.IntegerField(db_index=True, unique=True)
    trip_type = models.CharField(max_length=20, choices=trip_choice)

并且预订模型是 Fk with search

class Booking(models.Model)
    flight_search = models.ForeignKey(Search, on_delete=models.CASCADE)
    flight_id = models.CharField(
        max_length=100
    )
    return_id = models.CharField(
        max_length=100,
        blank=True,
        null=True
    )

如果行程类型为 Return 'R',则我有以下规则,返回 id 不能在序列化程序中发送为空。

class AddBookSerializer(BookSerializer):
    booking_id = serializers.IntegerField(source='flight_search.booking_id')
    class Meta(BookSerializer.Meta):
      fields = (
        'booking_id',
        'flight_id',
        'return_id',
    )

   def validate_booking_id(self, value):
       print(value.trip_type)

有什么方法可以根据预订 ID 访问旅行类型我真的被困在这里了。

【问题讨论】:

    标签: python django django-rest-framework django-serializer


    【解决方案1】:

    您可以像这样定义SerializerMethodField

    class AddBookSerializer(BookSerializer):
        booking_id = serializers.IntegerField(source='flight_search.booking_id')
        return_id = serializers.SerializerMethodField()
    
        class Meta(BookSerializer.Meta):
            fields = (
                'booking_id',
                'flight_id',
                'return_id',
            )
    
        # by default the method name for the field is `get_{field_name}`
        # as a second argument, current instance of the `self.Meta.model` is passed
        def get_return_id(self, obj):
            if obj.flight_search.trip_choice == 'R':
                # your logic here
            else:
                return obj.return_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-27
      • 1970-01-01
      • 2012-06-09
      • 2020-11-29
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多