【问题标题】:django rest framework serializer method field how todjango rest框架序列化方法字段如何
【发布时间】:2021-10-31 09:56:28
【问题描述】:

如何处理这个序列化方法字段?我感觉用initial_data是不对的,从数据库中提取数据时需要验证数据吗?从数据库中提取数据时是否需要使用序列化程序?

class ListingSerializer(serializers.ModelSerializer):

    rooms = serializers.SerializerMethodField()

    # This one works as expected
    def get_rooms(self, obj):
        rooms = list(Room.objects.filter(listing__id=obj.id).values())
        serializer = RoomSerializer(data=rooms, many=True)
        return serializer.initial_data
    
    # This one gives serializer errors
    def get_rooms(self, obj):
        rooms = list(Room.objects.filter(listing__id=obj.id).values())
        serializer = RoomSerializer(data=rooms, many=True)
        if serializer.is_valid():
            return serializer.data
        return serializer.errors

    class Meta:
        model = Listing
        fields = "__all__"
class Listing(models.Model):
    id = models.CharField(
        primary_key=True, default=generate_uuid, editable=False, max_length=36
    )
    agent = models.ForeignKey(
        "users.User", on_delete=models.CASCADE, blank=True, null=True
    )

    # property data
    title = models.CharField(max_length=100, blank=False, null=False)
    description = models.CharField(max_length=1000, blank=False, null=False)
    floor = models.IntegerField(blank=False, null=False)
    floor_count = models.IntegerField(blank=False, null=False)
    price = models.DecimalField(max_digits=10, decimal_places=2, default=Decimal(0.00))

    # address
    street = models.CharField(max_length=60, blank=False, null=True)
    house_no = models.CharField(max_length=10, blank=False, null=True)
    door_no = models.CharField(max_length=10, blank=False, null=True)
    city = models.CharField(max_length=20, blank=False, null=True)
    country = models.CharField(max_length=20, blank=False, null=True)
    postal_code = models.IntegerField(blank=False, null=True)

    # property reports
    tilstand_report = models.FileField(upload_to="reports", blank=False, null=True)
    water_consumption_report = models.FileField(
        upload_to="reports", blank=False, null=True
    )
    energy_level_report = models.FileField(upload_to="reports", blank=False, null=True)
    property_tax_report = models.FileField(upload_to="reports", blank=False, null=True)

    # metadata
    is_active = models.BooleanField(default=True)
    create_time = models.BigIntegerField(blank=True, null=True)

    def save(self, *args, **kwargs):
        self.create_time = int(datetime.now().timestamp() * 1000)
        super().save(*args, **kwargs)

    class Meta:
        ordering = ["create_time"]

【问题讨论】:

  • 你能分享Listing的模型吗?
  • @WillemVanOnsem 是的

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


【解决方案1】:

您可以将RoomSerializer 用作子序列化程序

class ListingSerializer(serializers.ModelSerializer):
    rooms = RoomSerializer(source='room_set', many=True)

    class Meta:
        model = Listing
        fields = '__all__'

source=… 应指定Room 模型中ForeignKeyrelated_name=…。如果没有指定related_name=…,默认是<i>modelname</i>_set,所以这里是room_set

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多