在Django中表达多个一对多和一对一的关系

时间:2018-03-07 21:18:19

标签: django django-models django-rest-framework

我正在设计一个送货应用程序。它有用户,地址和商店模型。我有以下要求:

  1. 用户可以拥有多个送货地址
  2. 商店只位于一个地方。
  3. 地址无法与用户和商店相关联。
  4. 模型如下:

    class User(AbstractBaseUser):
        ...
    
    class Address(models.Model):
        ...
    
    class Store(models.Model):
        ...
    

    第一项要求可以显示为:

    user = models.ForeignKey(User, on_delete=models.CASCADE)
    

    第二个要求可以显示为(在地址模型中):

        store = models.OneToOneField(Store, on_delete=models.CASCADE)
    

    此外,第二个要求可以显示为(在商店模型中):

        address = models.OneToOneField(Address, on_delete=models.CASCADE)
    

    表示第三个要求的最佳方式是什么。在这种情况下如何处理序列化?

    感谢。

1 个答案:

答案 0 :(得分:0)

如果您在地址模型上居中或遇到问题,可以在validation期间处理此案例:

class Address(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    store = models.OneToOneField(Store, on_delete=models.CASCADE, null=True)

    def clean(self):
        if self.user != None and self.store != None:
            raise ValidationError('Address must belong EITHER to user OR store, not both', code='invalid')

如果两个字段均为None,您可能还需要处理此案例。请注意,在数据库级别上,两个字段都需要被允许为null=True