如何通过反向ForeignKey更快地使Django ORM查询数据库工作?

时间:2018-04-09 16:45:02

标签: python django postgresql orm

我有3个与ForeignKey连接的模型:

class Product(TimeStampedModel):    
    product_id = models.AutoField(primary_key=True, )
    shop = models.ForeignKey('Shop', related_name='products', to_field='shop_name', on_delete=models.CASCADE)
    brand = models.ForeignKey('Brand', related_name='products', to_field='brand_name', on_delete=models.CASCADE)

    class Meta:
        indexes = [                
            models.Index(fields=['title', 'shop', 'sale']),
            models.Index(fields=['shop', 'brand', 'price', 'title']), ]


class Brand(models.Model):    
    brand_id = models.AutoField(primary_key=True,)
    brand_name = models.CharField(max_length=50, unique=True, blank=False, null=False)


class Shop(models.Model):
    shop_id = models.AutoField(primary_key=True,)
    shop_name = models.CharField(max_length=30, unique=True, blank=False, null=False, db_index=True)

从我的观点来看,我尝试过滤此商店可用的品牌,通过产品ForeignKey访问商店:

brands = Brand.objects.filter(products__shop__shop_name=shop).distinct('brand_name').order_by('brand_name')

问题是此查询需要很长时间才能处理:从1-3 +秒开始。有没有办法让它更快地运作?
可能是我可以添加一些索引?我已经尝试了一些组合(您可以在Product - Meta class中找到它们),但似乎没有帮助。

select_related('product') - 引发错误:Invalid field name(s) given in select_related: 'product'. Choices are: (none)

或者在创建品牌条目时可能有更好的方法 - 添加某种available_in_shops = ListField(...)(我发现这可以用JSONField制作,但我还不知道它是如何工作的)?并在那里存储可以获得该品牌的商店列表?

0 个答案:

没有答案