#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