【问题标题】:Django Model Design: User Owned Object Instances, Name Not UniqueDjango 模型设计:用户拥有的对象实例,名称不唯一
【发布时间】:2017-11-12 02:42:03
【问题描述】:

我对 Django 模型设计比较陌生,现在我想做这样的事情。

假设 Alice 有三只狗,分别是 Road-runner、Pinky 和 ​​Kiwi。 Bob 有一只名叫 Spinner 的猫,并且还和 Alice 一起拥有了 Pinky。

所以对象 Pet 的名称不是唯一的。一只宠物可以拥有多个主人。我认为这是多对多的关系。

现在在我看来,我想列出自己的宠物。我该如何实施?我知道这与用户身份验证和外键等有关,如果有人能指出一些方向或清晰的解释,那就太好了。

我现在有:

class Pet(models.Model):
    name = models.CharField(max_length=100)

class Owner(models.Model):
    pet = models.ForeignKey(Pet, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)

我应该把owner = models.ForeignKey(Owner, on_delete=models.CASCADE) 放在 Pet 对象中吗?如果网站都是关于宠物的,而主人只是宠物的附加信息。

直觉上,我倾向于将owner = models.ForeignKey(Owner, on_delete=models.CASCADE) 放在 Pet 对象中是正确的方法。

然后如何将用户限制在自己的对象上?如果宠物被重命名,它必须被它的主人信息过滤掉,这样我们就不会重命名别人的宠物。

感谢您的宝贵时间。

编辑:

class Pet(models.Model):
    name = models.CharField(max_length=100)

class Owner(models.Model):
    pet = models.ManyToManyField(Pet)
    name = models.CharField(max_length=100)
    user = models.ForeignKey(settings.AUTH_USER_MODEL)

【问题讨论】:

    标签: django model-view-controller django-models model


    【解决方案1】:

    所以对象 Pet 的名称不是唯一的。一只宠物可以拥有多个主人。我认为这是多对多的关系。

    听起来很像,但您创建的不是多对多关系。应该是这样的:

    class Pet(models.Model):
        name = models.CharField(max_length=100)
    
    class Owner(models.Model):
        pet = models.ManyToManyField(Pet)
        name = models.CharField(max_length=100)
        user = models.OneToOneField(User)
    

    ManyToMany 字段参考:https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.ManyToManyField

    请注意,我在所有者和用户之间添加了一对一。这样你就可以

    @login_required
    def my_pets(request):
        Pet.objects.filter(owner__user=request.user)
    

    请注意,这些是指南。您需要根据需要填写您的代码。

    【讨论】:

    • 谢谢!它突然变得清晰了,我无法回想一些奇怪的实现。我看到有人这样做user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1, blank=True, related_name="pet_user"),它是同一件事还是与你的 OneToOneField 行有关?
    • 这实际上是推荐的做法。但我认为你会发现它更难消化。在我的示例中,您只需将 import django.contrib.auth.models User 添加到模型文件中
    • 但是那个blank=True,以及related_name 部分可以省略。(即你看到的解决方案中的那个部分是多余的)
    • 使用user = models.OneToOneField(User)user = models.ForeignKey(User)?
    • 对不起,如果一只宠物可以拥有多个主人,它应该是 ForeignKey
    猜你喜欢
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2020-01-07
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    相关资源
    最近更新 更多