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')。这个现在很好用。