簡體   English   中英

一個模型如何具有多個具有與值相同類型的模型的鍵?

[英]How can a model have multiple keys with the same type of models as values?

我在做一個應用程序,我應該做一個Model ,其有2個按鍵,節省了相同類型的模型。

用英語表達不容易,所以我將上傳情況圖片。

在此處輸入圖片說明

Food Pair Model (或者我可以稱其為表)

我想引用Food Model無法使用ForeignKey或ManyToManyField

ERRORS:
food_test.FoodQuestion.left_food: (fields.E304) Reverse accessor for 'FoodQuestion.left_food' clashes with reverse accessor for 'FoodQuestion.right_food'.
    HINT: Add or change a related_name argument to the definition for 'FoodQuestion.left_food' or 'FoodQuestion.right_food'.
food_test.FoodQuestion.right_food: (fields.E304) Reverse accessor for 'FoodQuestion.right_food' clashes with reverse accessor for 'FoodQuestion.left_food'.
    HINT: Add or change a related_name argument to the definition for 'FoodQuestion.right_food' or 'FoodQuestion.left_food'.

我不知道在這種情況下使用什么數據庫關系以及如何創建它。

在這種情況下我可以使用什么?

您必須為FoodPair模型中的每個ForeignKey字段定義一個唯一的related_name。

class FoodPair(models.Model):
    first_food = models.ForeignKey(Food, related_name="first_food")
    second_food = models.ForeignKey(Food, related_name="second_food")
    what_i_buy = models.ForeignKey(Food, related_name="what_i_buy")

如果未定義related_name,則Django會自動對其進行設置,並且當有多個ForeignKey字段指向同一模型時,名稱會發生​​沖突。

當您從一個模型創建到另一個模型的ForeignKey ,Django會在所引用的模型上動態創建一個屬性,該屬性將返回QuerySet以及所有具有該對象外鍵的對象

例如

class Foo(models.Model):
    pass

class Bar(models.Model):
    foo = models.ForeignKey(Foo, on_delete=models.CASCADE)

foo = Foo.objects.create()
bar = Bar.objects.create(foo=foo)
foo.bar_set.all()  # This will return a queryset containing foo

默認情況下,此屬性為<model_name_lowercase>_set 在您的情況下,因為從一個模型到同一模型有2個外鍵,Django嘗試在Food模型上為每個外鍵創建相同的屬性。

要解決此問題,您可以使用related_name來指定此屬性的名稱,如果將此屬性設置為“ +”,則不會建立任何反向關系,也不能給它們指定唯一的名稱

class FoodQuestion(models.Model):
    left_food = models.ForeignKey(Food, on_delete=models.CASCADE, related_name='+')
    left_food = models.ForeignKey(Food, on_delete=models.CASCADE, related_name='+')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM