我想使用Django中的子模型对象访问父模型字段

时间:2019-11-25 09:51:26

标签: python django postgresql django-models

大家好,我在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查询集,因为我找不到任何可以执行此任务的查询。

如果你们还有其他解决方案,请提出建议!!!

4 个答案:

答案 0 :(得分:1)

您可以这样做

Book.objects.filter(book_owner__user_city="Silicon Valley")

,您可以在以下位置了解有关各种加入的更多信息 this link

答案 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)|
    .................)