[英]I want to access parent model fields using child model object in django
大家好,我在我的 Django 项目中有一个查询。 首先,你可以看到我有两个名为 BookSeller 和 Book 的 Django 模型
书商模式
class BookSeller(models.Model):
user_name = models.CharField(max_length=200)
user_email = models.CharField(max_length=200)
user_password = models.CharField(max_length=200)
user_phone = models.CharField(max_length=100)
user_photo = models.ImageField(upload_to='book/seller_photos/%Y/%m/%d/', blank=True)
user_address = models.CharField(max_length=300)
user_state = models.CharField(max_length=100)
user_city = models.CharField(max_length=100)
def __str__(self):
return self.user_name
书型
class Book(models.Model):
book_owner = models.ForeignKey(BookSeller, related_name='book_seller', on_delete=models.CASCADE)
book_category = models.CharField(max_length=200)
book_title = models.CharField(max_length=200)
book_price = models.IntegerField()
book_edition = models.CharField(max_length=200)
book_author = models.CharField(max_length=200)
book_old = models.IntegerField()
book_page = models.IntegerField()
book_description = models.TextField(max_length=200)
book_image_1 = models.ImageField(upload_to='book/book_photos/%Y/%m/%d', blank=True)
book_image_2 = models.ImageField(upload_to='book/book_photos/%Y/%m/%d', blank=True)
book_image_3 = models.ImageField(upload_to='book/book_photos/%Y/%m/%d', blank=True)
book_image_4 = models.ImageField(upload_to='book/book_photos/%Y/%m/%d', blank=True)
def __str__(self):
return self.book_title
想做的事:在我的项目中,我想查找该书商所在城市的书籍。 例如,如果我在搜索字段中输入城市名称“Silicon Valley”,那么它应该会显示所有属于 Silicon Valley 的 Sellers(BookSeller) 的“书籍”。
查询:所以我的查询是如何执行 Django 查询集,因为我找不到任何可以执行此任务的查询。
如果你们有任何其他解决方案,那么请给我建议!!!
要按某个书商所在城市查找书籍,您可以像这样简单地过滤 Book 实例:
Book.objects.filter(book_owner__user_city="Silicon Valley")
我注意到的另一个问题是我认为您误解了ForeignKey
related_name
属性。
related_name
属性指定从 BookSeller 模型返回到 Book 模型的反向关系的名称。
如果您没有指定 related_name,Django 会自动使用您的模型名称和后缀 _set 创建一个。
例如,在您的 FK 中更合适的相关名称是books
,并且没有定义它会默认为book_set
。
book_owner = models.ForeignKey(BookSeller, related_name='books', on_delete=models.CASCADE)
这是一个示例,假设您有 1 个 BookSeller 实例和 2 个带有 FK 的 Book 实例到 BookSeller 实例。
my_book_seller = BookSeller(...)
my_book_1 = Book(book_owner=my_book_seller, ...)
my_book_2 = Book(book_owner=my_book_seller, ...)
现在,在您的情况下,执行my_book_seller.book_seller.all()
(因为您将book_seller
定义为book_seller
)将返回属于my_book_seller
的两个 Book 实例。 这没有多大意义。 另一方面,使用related_name='books'
可以通过执行my_book_seller.books.all()
获得相同的书籍。
您可以在docs 中找到更多信息。
您可以通过执行以下操作获得所需的结果
books_by_seller_city = Book.objects.filter(book_owner__user_city='Silicon Valley')
请注意__
的使用,它告诉 ORM 查看引用的模型属性。
您也可以使用 q 查找,在这种情况下,您可以在查询中添加更多字段。
queryset = Book.objects.filter(Q(book_owner__user_city__icontains=query)|
.................)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.