Django在相关外键上结合了许多不相关的模型

2024-09-29 21:33:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有3个型号T、E、Q,以便:

class E(Model):
    name_e = CharField()

class T(Model):
    name_t = CharField()
    e = ForeignKey(E)

class Q(Model):
    name_q = CharField()
    e = ForeignKey(E)

我还为以下各项提供了序列化程序:

class ESerializer(ModelSerializer):
    class Meta:
        model = E
        fields = '__all__'

class TSerializer(ModelSerializer):
    e = ESerializer()
    class Meta:
        model = T
        fields = '__all__'

class QSerializer(ModelSerializer):
    e = ESerializer()
    class Meta:
        model = Q
        fields = '__all__'

对于一个E行,可以有许多T行和Q行。 我可以提出这样一个问题:

t = T.objects.filter(e__id=1).all()
serialized_t = TSerializer(t, many=True).data

并且serialized_t的输出将类似于:

[
 {id:7, name_t:'test_1', e:{id:1, name_e:'ename_1'}},
 {id:9, name_t:'test_2', e:{id:1, name_e:'ename_1'}}
]

我的问题是如何组合它,以便在上面的查询中包含Q,从而为T查询创建一个输出,该查询还将包含e_id=1的所有Q,因此它看起来像这样:

[
 {id:7, name_t:'test_1', e:{id:1, name_e:'ename_1'}, q:[{id:4, name_q:'qname_1'}, {id:5, name_q:'qname_2'}]},
 {id:9, name_t:'test_2', e:{id:1, name_e:'ename_1'}, q:[{id:4, name_q:'qname_1'}, {id:5, name_q:'qname_2'}]}
]

我不介意这是否可以在查询本身中完成,或者它是否涉及到对SerializedT对象的一些附加,只要它的末尾有一个符合我需要的序列化结果,我可以将其作为JSON对象作为API响应发送


Tags: nametestidfieldsmodelallmetaclass
1条回答
网友
1楼 · 发布于 2024-09-29 21:33:19

这可以通过如下方式编写T序列化程序来完成:

class TSerializer(ModelSerializer):
    e = ESerializer()
    q = QInTSerializer(source='e.q_set', many=True)

    class Meta:
        model = T
        fields = '__all__'

这将构建一个q字段,该字段表示Q对象的列表。指定source='e.q_set'是为了告诉字段在哪里从正在序列化的T实例中查找那些Q列表(在本例中,所有Q都与TE相关)

但是您还必须编写另一个Q序列化程序,以不显示Q中的E(仅根据需要idname_q):

class QInTSerializer(ModelSerializer):
    class Meta:
        model = Q
        fields = ('id', 'name_q')

如果您计划通过选择相关的E对象并从E预取相关的Q对象来序列化多个T对象,则还可以在数据库命中时进行保存:

t = T.objects.select_related('e').prefetch_related('e__q_set')

相关问题 更多 >

    热门问题