在django queryset中按父字段过滤

3duebb1j  于 2023-03-31  发布在  Go
关注(0)|答案(1)|浏览(132)

嗨,我想通过它的蛞蝓得到咖啡店的所有项目.因为很明显,它保存了pk不是模型中的蛞蝓.有没有什么方法可以得到这个,而不是找到咖啡馆pk等.我正在寻找一些东西,就像只是一个查询它.这里是我编码:

网址

path(
     "<str:cafe_slug>/",
     ProfileList.as_view(),
     name="get_item_menu",
     ),

查看

def get(self, request,cafe_slug):
    queryset = Item.objects.filter(cafe__slug=cafe_slug)

型号

class Item(models.Model):
    name = models.CharField(max_length=256, unique=True,)
    cafe = models.ForeignKey(CoffeeShop, on_delete=models.CASCADE)

class CoffeeShop(models.Model):
    name = models.CharField(max_length=256, unique=True)
    slug = models.CharField(max_length=256, unique=True,)
kq0g1dla

kq0g1dla1#

您可以通过相关名称从coffeeshop跟随到相关项。您没有在Item上指定related_name,因此Django默认值为item_set。因此,我认为您需要

coffee_shop = CoffeeShop.get( slug=whatever)
all_items = coffee_shop.item_set.all()
for item in all_items:
     # do stuff

item_set接受Item上的查询集接受的所有方法。
我个人不喜欢default related_name,总是在Item.cafe上显式地编码related_name="..."
如果您只需要项目,不需要coffee_shop示例,但知道标识coffee_shop的slug,那么视图中的查询是正确的。
可以使用prefetch_related来获取与coffee_shop示例相关的所有项,但如果查看SQL,则在该级别上仍然是两个查询

coffee_shop = CoffeeShop.prefetch_related('item_set').get( slug=whatever)
for item in coffee_shop.item_set.all():
     # won't hit the DB again provided you don't filter it further.

相关问题