繁体   English   中英

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

[英]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.objects.filter(book_owner__user_city="Silicon Valley")

您可以在此链接中了解有关各种加入的更多信息

要按某个书商所在城市查找书籍,您可以像这样简单地过滤 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM