Python 在django中使用select_related和prefetch_related进行筛选和提取

Python 在django中使用select_related和prefetch_related进行筛选和提取,python,python-3.x,django,django-models,Python,Python 3.x,Django,Django Models,以下是我的以下型号: class City(models.Model): city = models.CharField('city name', max_length=25) class Pincode(models.Model): city = models.ForeignKey(City, on_delete=models.CASCADE, related_name='city_pincode') pincode = models.PositiveIntegerF

以下是我的以下型号:

class City(models.Model):
    city = models.CharField('city name', max_length=25)

class Pincode(models.Model):
    city = models.ForeignKey(City, on_delete=models.CASCADE, related_name='city_pincode')
    pincode = models.PositiveIntegerField('pincode', unique=True)

class Vendors(models.Model):
    pincode = models.ManyToManyField(Pincode, related_name='pincode_vendor')
    shop_name = models.CharField('Shop name(English)', max_length=50)

class SubCategory(models.Model):    
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='category_subcategory')
    vendor = models.ForeignKey(Vendors, on_delete=models.CASCADE, related_name='vendor_subcategory')

class ItemGroup(models.Model):
    name = models.CharField('name', max_length=50, unique=True, blank=True)

class Item(models.Model):
    subcategory = models.ForeignKey(SubCategory, on_delete=models.CASCADE, related_name='subcategory_item')
    itemgroup = models.ForeignKey(ItemGroup, on_delete=models.CASCADE, related_name='itemgroup_item')
    name = models.CharField('name', max_length=255)
我正在尝试从模型Item和itemgroup中使用字段itemgroup和pincode获取所有子类别

这是我的密码:

SubCategory.objects.filter(vendor__pincode__pincode=500071).prefetch_related(Prefetch('subcategory_item',
            queryset=Item.objects.filter(itemgroup__name='Biryanis')
        ))

下面是我正在获取子类别模型中的所有项目。但我只想要那些itemgroup='Biryanis'和pincode='500071'的子类别。

我认为您误解了
选择与
相关的
预取与
相关的
。这两种方法仅用于通过最小化数据库调用来获得性能

您的代码不会对子类别\u项执行筛选。使用以下代码执行此操作

SubCategory.objects.filter(vendor__pincode__pincode=500071).filter(subcategory_item__itemgroup__name='Biryanis')

如果您的问题是关于性能:
如果只调用一次数据库,使用
select_related
prefetch_related
对您没有好处。使用这些方法也有一些缺点。请务必阅读查询集。

谢谢您的回答。只是代码子类别.objects.filter(vendor\uu pincode\uu pincode=500071)中的一个小更改。filter(子类别\u item\uuu itemgroup\uu name='Biryanis')。这个现在很好用。