【问题标题】:Django Serializers: multiple tables OneToOne relation to a tableDjango序列化器:多个表OneToOne关系到一个表
【发布时间】:2017-02-21 19:57:34
【问题描述】:

这是 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 正在按预期工作。

问题一:

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

问题 2:

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

b = BSerializer(many=False)
c = CSerializer(many=False)

如果特定行的 A 和 C 之间没有关系,则可能会出错。我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    首先,我建议如果您打算拥有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 A 的定义放在class Bclass 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)
    

    【讨论】:

    • 在 B 和 C 之后添加 A 的定义仍然会报错,因为 B 和 C 正在使用 A。
    • 嗯,你可以尝试一些真正的 hacky,方法是在末尾添加另一个序列化程序类,它只是子类 A:class HackyClassA(A): pass
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 2015-03-04
    • 2019-07-29
    相关资源
    最近更新 更多