我对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)
答案 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)
请注意,这些是指南。您需要根据需要填写代码。