如何在Django中将两个序列化器多对一地加入?

时间:2019-04-27 16:08:44

标签: django django-rest-framework

我正在尝试加入两个序列化器。 我试图获取table_db,否则,我试图插入具有table_db id的other_table列表(从table_db查询)到对象的哪个寄存器中。

这种关系是多对一的,因此,一个other_table有一个table_db,但是,table_db有许多other_table。 在示例中更清楚:

     t_db =table_db.objects.all()
     data_table_db = table_dbSerializer(t_db,many=True).data

    for t in t_db:        
        o_t_db = other_table.objects.filter(table_db_id=t.pk)
        data_other_table= other_tableSerializer(o_t_db,many=True).data
        **data = data_table_db + data_other_table ????? //HOW CAN INSERT IT?**

    return Response(data, status=status.HTTP_200_OK)

模型

  class other_table(models.Model):
      table_db = models.ForeignKey(Table_db, on_delete=models.CASCADE, blank=True,null=True)

在table_db中,我没有对other_table的任何引用,因为它有很多引用。

序列化器目前是基本的:

from table_db.models import table_db
from other_table.models import other_table

class other_tableSerializer(serializers.ModelSerializer):
    class Meta:
       model = other_table
       fields = (
     )

class table_dbSerializer(serializers.ModelSerializer):
    class Meta:
       model = table_db
       fields = (
    )

1 个答案:

答案 0 :(得分:3)

您的代码示例有点含糊(对我而言)。因此,我决定为您创建一个通用的。另外,我对模型做了一个简单的更改,在FK字段中添加了 related_name 自变量

# models.py
class Foo(models.Model):
    # some fields
    ...


class Bar(models.Model):
    foo = models.ForeignKey(Foo, on_delete=models.CASCADE, blank=True, null=True, related_name='bars')

然后我创建了如下的 嵌套DRF序列化器

# serializers.py
class BarSerializer(serializers.ModelSerializer):
    class Meta:
        model = Bar
        fields = '__all__'


class FooSerializer(serializers.ModelSerializer):
    bars = BarSerializer(many=True, read_only=True) # here is the magic happens

    class Meta:
        model = Foo
        fields = '__all__'

然后,只需将 Foo 查询集传递给 FooSerializer ,您将获得所需的响应。

# views.py
def foo_view(request):
    foo_qs = Foo.objects.all()
    foo_serializer = FooSerializer(foo_qs, many=True)
    return Response(foo_serializer.data)

参考
1. What is related_name used for in Django?
2. FK related_name--Django Doc
3. DRF Nested Serializer