【问题标题】:Express multiple one-to-many and one-to-one relationship in Django在Django中表达多个一对多和一对一的关系
【发布时间】:2018-03-07 21:18:18
【问题描述】:

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

  1. 用户可以有多个收货地址
  2. 商店仅位于一处。
  3. 地址不能同时与用户和商店链接。

模型如下:

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)

另外,第二个需求可以显示为(在 Store 模型中):

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

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    如果您以地址模型为中心或有问题,您可以在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

    【讨论】:

    • 对于 User 和 Store,我的序列化程序会是什么样子?我想返回类似 user = { "first_name": "Jon", "last_name": "Doe", "delivery_addresses": [ { "address": "" } ] } store = { "store_name": "Store A", "位置": { "地址": "" } } formatted json
    • 只需使用Django serializer。你不必自己处理任何事情。让 Django 来做吧 :)
    猜你喜欢
    • 2015-07-05
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 2015-11-25
    • 1970-01-01
    相关资源
    最近更新 更多