大家好,我在Django项目中有一个查询。 首先,您可以看到我有两个名为BookSeller和Book
的Django模型。Bookseller模型
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
想做的事:在我的项目中,我想按那个书商所在的城市查找书。 例如,如果我在搜索栏中输入城市名称“硅谷”,那么它应该向我显示属于硅谷的所有Sellers(BookSeller)的“图书”。
查询:所以我的查询是如何执行Django查询集,因为我找不到任何可以执行此任务的查询。
如果你们还有其他解决方案,请提出建议!!!
答案 0 :(得分:1)
答案 1 :(得分:0)
您可以通过类似的操作获得所需的结果
books_by_seller_city = Book.objects.filter(book_owner__user_city='Silicon Valley')
请注意使用__
,它告诉ORM查看所引用的模型属性。
答案 2 :(得分:0)
要按某个书商所在城市查找书,您可以像这样简单地过滤Book实例:
Book.objects.filter(book_owner__user_city="Silicon Valley")
我注意到的另一个问题是,我认为您误解了related_name
中的ForeignKey
属性。
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()
(因为您将related_name定义为book_seller
)将返回属于my_book_seller
的两个Book实例。这没有多大意义。
另一方面,拥有related_name='books'
可以使您my_book_seller.books.all()
得到相同的书。
您可以在docs中找到更多信息。
答案 3 :(得分:0)
您也可以使用q查找,在这种情况下,您可以在查询中添加更多字段。
queryset = Book.objects.filter(Q(book_owner__user_city__icontains=query)|
.................)