2017-06-10 42 views
1

我相對較新的Django模型設計,現在我想要做這樣的事情。Django模型設計:用戶擁有的對象實例,名稱不唯一

假設愛麗絲有三條名爲Road-runner,Pinky和Kiwi的狗。 Bob有一隻叫做Spinner的貓,並且還擁有Pinky和Alice在一起。

所以對象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)呢?如果網站是關於寵物的,而所有者只是附在寵物身上的信息。

直覺上,我傾向於將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

所以對象的寵物的名字是不是唯一的。寵物可以擁有多個所有者。我認爲這是多對多的關係。

聽起來很像它,但是你創造的並不是多對多的關係。它應該是這樣的:

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) 

參考爲多對多領域: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) 

請注意,這些是指導方針。您需要根據需要填寫代碼。

+0

謝謝!它突然變得更加清晰,我無法將頭部包裹起來,並考慮一些奇怪的實現。我看到有人在做這個'user = models.ForeignKey(settings.AUTH_USER_MODEL,default = 1,blank = True,related_name =「pet_user」)',這與OneToOneField行是相同還是相關的? –

+0

這是它的推薦方式。但我認爲你會發現消化更難。在我的示例中,您只需將'import django.contrib.auth.models User'添加到您的模型文件 – e4c5

+0

但是該空白= True,並且related_name部分可以省略(即您看到的其他解決方案中的那部分是冗餘的) – e4c5

相關問題