我有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制作,但我还不知道它是如何工作的)?并在那里存储可以获得该品牌的商店列表?