Невозможно вызвать набор запросов с помощью внешнего ключа в Django

#python #django

#python #django

Вопрос:

Версия

Mac OS : 10.15.6 Django : 3.7.6

Что я хочу сделать

Получить все Want_Item , которые имеются у определенного user

Здравствуйте, я новичок в Django. Я пытаюсь создать приложение, в котором каждый мог бы обмениваться своими товарами. Я создал модели, User , Parent_Item Want_Item Give_Item . И установил отношения между ними, как показано ниже.

  • User Parent_Item => Один ко Многим
  • Parent_Item Give_Item => Один ко Многим
  • Parent_Item Want_Item => Один ко Многим

Мне удалось получить все parent_item , что есть у одного пользователя. Однако по какой-то причине я не могу получить want_item . Это мои попытки и ошибки, с которыми я столкнулся.

 >>>toshi_want = Toshi.item.want_item.all()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'RelatedManager' object has no attribute 'want_item'

>>> toshi_all=Toshi.item.all()
>>> print(toshi_all)
<QuerySet [<Parent_Item: MacBook>, <Parent_Item: Desk>, <Parent_Item: shirt>]>
>>> print(toshi_all.want_item.all())
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'QuerySet' object has no attribute 'want_item'
  

Я, конечно, установил ForeignKey с помощью related_name = "want_item" .
Почему я не могу использовать это в этом случае??

Я бы хотел, чтобы вы научили меня решениям и объяснили, почему это происходит.

models.py

 class User(models.Model):
    username = models.CharField(max_length=150, unique=True)
    email = models.EmailField(max_length=100, unique=True)
    password = models.CharField(max_length=20)
    confirm_pass = models.CharField(max_length=20)
    profile = models.TextField(max_length=800, blank=True, null=True)
    icon = models.ImageField(blank = True, null = True)
    login = models.BooleanField(default=False)
    # createdAt, updatedAt は時系列順等に並べたいモデルに付与
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

    def __str__(self):
        return self.username

    class Meta:
        db_table = "users"



class Give_Item(models.Model):
    ITEM_STATE = (
        ("新品", "新品、未使用"),
        ("未使用", "未使用に近い"),
        ("傷や汚れなし", "目立った傷や汚れなし"),
        ("やや傷や汚れあり", "やや傷や汚れあり"),
        ("傷や汚れあり", "傷や汚れあり"),
        ("状態が悪い", "全体的に状態が悪い")
    )
    state = models.CharField(max_length=20, choices=ITEM_STATE, default="新品")
    detail = models.TextField(max_length=800, blank=True, null=True)
    category = models.ForeignKey("Category", related_name="give_item", on_delete = models.SET_NULL, null = True)
    parent_item = models.ForeignKey("Parent_Item", null=True, on_delete=models.CASCADE, related_name="give_item")
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

    def __str__(self):
        return self.parent_item.name

    class Meta:
        db_table = "give_items"

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

class Want_Item(models.Model):
    url = models.URLField(max_length=250, null=True, blank=True)
    parent_item = models.ForeignKey("Parent_Item", null=True, on_delete=models.CASCADE, related_name="want_item")
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

    def __str__(self):
        return self.parent_item.name

    class Meta:
        db_table = "want_items"

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

class Parent_Item(models.Model):
    name = models.CharField(max_length=100)
    owner = models.ForeignKey(User, on_delete=models.CASCADE, null=True, related_name="item")
    # テーブル内のフィールドはRequst, Deal の外部キー(requet, deal)
    keyword = models.ManyToManyField(Keyword, related_name = "parent_item")
    # Blandは一つしか選べないため、OneToMany関係
    bland = models.ForeignKey(Bland, related_name="parent_item", on_delete=models.SET_NULL, null=True)
    request_deal = models.ForeignKey("Request_Deal", null=True, on_delete=models.CASCADE, related_name="parent_item")
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

    def __str__(self):
        return self.name

    class Meta:
        db_table = "parent_items"

  

Комментарии:

1. Попробуйте toshi_all[0].want_item.all()

2. Спасибо, что сказали мне это. На самом деле, я получил один запрос. Я заметил, что благодаря вам у меня были точно все User объекты. Еще раз большое вам спасибо.

Ответ №1:

Что-то вроде этого?

 user_primary_key = 1
Want_Item.objects.filter(parent_item__owner=user_primary_key)
  

Комментарии:

1. Спасибо, что научили меня этому. Это работает! Я получил все want_item благодаря вам. Могу ли я получить все want_item из User объекта, как я это сделал? Если вы не против, я бы хотел, чтобы вы объяснили мне, почему я не смог использовать объект want_item через User .

2. Нет, вы не можете. Потому что User и Want_Item не находятся в прямой связи друг с другом.

3. Я понял. Спасибо, что научили меня этому и помогли мне.

Ответ №2:

я не могу комментировать, поэтому я отвечу вам здесь. ваша модель «want_item» имеет отношение к «parent_item» с соответствующим именем «want_item», а не к вашей пользовательской модели! вы можете использовать: User.item.want_item