Django模型设计:用户拥有的对象实例,名称不唯一

时间:2017-06-10 01:26:24

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

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

假设爱丽丝有三只名叫Road-runner,Pinky和Kiwi的狗。 鲍勃有一只叫做Spinner的猫,还和爱丽丝一起拥有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)

1 个答案:

答案 0 :(得分:0)

  

因此对象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)

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