【问题标题】:Django Rest Framwork - Select only some fields in reverse lookup querysetDjango Rest Framework - 仅选择反向查找查询集中的某些字段
【发布时间】:2020-01-31 05:54:09
【问题描述】:

我正在尝试仅检索与出租物业“单元”关联的“约会”中的部分字段。在 UnitSerializer 中,我调用 SerializerMethodField() 对“约会”字段进行反向查找。这效果很好。但是,查询集返回每个对象中的所有字段(id、时间、单位、人员、潜在客户),而我只需要几个(id、时间)。

我在查询集上尝试了 .values(),如下所示:

queryset = instance.appointment_set.values('id', 'appointment_time')

但是我得到 "Got KeyError 在尝试获取序列化程序 AppointmentSerializer 上的字段单元的值时。\n序列化程序字段可能命名不正确,并且与 dict 实例上的任何属性或键都不匹配。\n原始异常文本是: 单位。”

请注意确定是否需要所有代码,但这是必不可少的。

模型

class Appointment(models.Model):
    appointment_time = models.DateTimeField()
    unit = models.ForeignKey(Unit, on_delete=models.CASCADE)
    staff = models.ForeignKey(Staff, on_delete=models.CASCADE)
    prospect = models.ForeignKey(Prospect, on_delete=models.CASCADE)

序列化器

class AppointmentSerializer(serializers.ModelSerializer):

    class Meta:
        model = Appointment
        fields = ['id','appointment_time']


class UnitSerializer(serializers.ModelSerializer):
    appointment = SerializerMethodField()

    class Meta:
        model = Unit
        fields = ['id', 'address', 'appointment']

    def get_appointment(self, instance):
        cutoff = _datetime.date.today() + timedelta(hours=72)
        queryset = instance.appointment_set.exclude(appointment_time__gt=cutoff)
        return AppointmentSerializer(queryset, many=True).data

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    在序列化器中处理反向关系有更好的方法:

    class UnitSerializer(ModelSerializer):
        appointment = AppointmentSerializer(many=True, source='appointment_set')
    
    class Meta:
        model = Unit
        fields = ['id', 'address', 'appointment']
    

    【讨论】:

    • 如果我不打算过滤查询集,您的解决方案要简单得多并且可以完美运行。但是,我首先使用 SerializerMethodField() 的原因是最终像这样过滤查询集:queryset = instance.appointment_set.exclude(appointment_time__gt=cutoff)。只有从这个过滤的查询集中,我才会返回一些字段(id、约会时间)。我已经更新了我的问题以澄清这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2014-10-03
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    相关资源
    最近更新 更多