어떤 사이트에 어떤 제품이 표시되는지 쉽게 제어 할 수 있어야하며 많은 제품이 있으므로 카테고리, 제작자 및 태그를 통해 제품 사이트를 설정하고 싶습니다. 따라서 제품 OR (해당 카테고리와 제작자 및 태그 중 하나)이 사이트에 링크되어있는 경우 사이트에 제품을 표시합니다. 내가 get_sites
방법을 최적화하는 방법Django의 복잡한 다중 모델 쿼리 최적화
from django.db.models import Model, ManyToManyField, ForeignKey, BooleanField
class Site(Model):
enabled = BooleanField()
class Producer(Model):
sites = ManyToManyField(Site)
class Category(Model):
sites = ManyToManyField(Site)
class Tag(Model):
sites = ManyToManyField(Site)
class Product(Model):
producer = ForeignKey(Producer)
category = ForeignKey(Category)
tags = ManyToManyField(Tag)
sites = ManyToManyField(Site)
def get_site_ids(self):
if self.sites.exists():
return list(self.sites.values_list('id', flat=True))
else:
p = list(self.producer.sites.values_list('id', flat=True))
c = list(self.category.sites.values_list('id', flat=True))
t = sum([list(tag.sites.values_list('id', flat=True)) for tag in self.tags.all()], [])
ids = set.intersection(set(p), set(c), set(t))
return ids
내 질문은 : 내가 함께 결국 코드는 다음 (간체)인가? 일부 쿼리에 참여할 수 있습니까?
업데이트 : 나는 색인 생성되고 검색 엔진에 의해 저장되는 사이트 ID에만 관심이 있습니다.
감사합니다. 사이트 ID 만 있으면됩니다. – Andrei
불행히도 Sum aggregator는 사이트 ID를 수집해야하므로 여기서는 도움이되지 않습니다. 더 많은 쿼리를 실행해야합니다 (예 : @pram에 언급 된'prefetch_related '와 함께). – Andrei