Django Serializers:多个表OneToOne与表的关系

时间:2016-10-12 21:07:07

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

这是Django ORM模型

class A(models.Model):
    ...

class B(models.Model):
    a = models.Foreignkey(A, on_delete=models.CASCADE)

class C(models.Model):
    a = models.Foreignkey(A, on_delete=models.CASCADE)

以下是序列化器:

class ASerializer(serializers.ModelSerializer):
    class Meta:
        model = A

class BSerializer(serializers.ModelSerializer):
    a = ASerializer(many=False)
    class Meta:
        model = B

class CSerializer(serializers.ModelSerializer):
    a = ASerializer(many=False)
    class Meta:
        model = C

B和C按预期工作。

问题1:

现在,如果我想通过执行b = BSerializer(many=False)c = CSerializer(many=False)从序列化工具A获取B和C的数据。我将收到NameError: name 'BSerializer' is not defined的错误,如果我将B和C序列化器放在Aserializer的A错误之上。我该如何解决这个问题?

问题2:

B和C与A具有一对一的关系。因此,在序列化A时,它可能在B和C表中没有后续的B或C或两个数据。 所以,在ASerializer中

b = BSerializer(many=False)
c = CSerializer(many=False)
如果特定行的A和C之间没有关系,

可能会出错。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

首先,我建议如果您打算拥有one-to-one relationship,那么您实际上是这样定义的:

class A(models.Model):
    ...

class B(models.Model):
    a = models.OneToOneField(A, on_delete=models.CASCADE)

class C(models.Model):
    a = models.OneToOneField(A, on_delete=models.CASCADE)

问题一

我还没有测试过这个,但它可能是定义订单问题吗?如果您在class Aclass B之后放置class C的定义会怎样?

问题二

尝试将required=False, allow_null=True添加为suggested here

b = BSerializer(many=False, required=False, allow_null=True)
c = CSerializer(many=False, required=False, allow_null=True)