Mam pytanie, które próbuję rozwiązać na jeden dzień teraz.Django Prefetch powiązane bez duplikatów ze stołem pośrednim
ze wzorami
class Quote(models.Model):
text = models.TextField()
source = models.ForeignKey(Source)
tags = models.ManyToManyField(Tag)
...
class Source(models.Model):
title = models.CharField(max_length=100)
...
class Tag(models.Model):
name = models.CharField(max_length=30,unique=True)
slug = models.SlugField(max_length=40,unique=True)
...
Próbuję modelować świat cytatów. ze związkami: jedna o wielu różnych Quote
, jedna o wielu numerach Quote
o wielu numerach Quote
. Problem:
- Jak mogę uzyskać wszystkie
Tag
s, które są zawarte wSource
(poprzez zawarteQuote
S)? - z minimalnymi możliwymi zapytaniami.
- z ilością czasach są one zawarte w tym źródle
Próbowałem naiwny jeden bez pobierania wstępnego związanego, z metodą modelu
def source_tags(self):
tags = Tag.objects.filter(quote__source__id=self.id).distinct().annotate(usage_count=Count('quote'))
return sorted(tags, key=lambda tag:-tag.usage_count)
I w szablonie:
{% for tag in source.source_tags|slice:":5" %}
source.quote
{% endfor %}
teraz mam
sources = Source.objects.all().prefetch_related('quote_set__tags')
W szablonie nie mam pojęcia, jak poprawnie iterować, aby uzyskać Tag
s dla jednego źródła, i jak chciałbym je zliczyć zamiast wymieniać duplikaty tagów.
źle przetestować to wkrótce, dzięki do tej pory – niklas
@ user9 Czy to działa tak, jak zamierzałeś? – Pratyush
Nie mogę go uruchomić w zamierzony sposób. lista wartości zawiera wiele wartości źródłowych kilka razy ... (co najmniej {% dla źródła w źródłach%} nie działa). Wyniki nie są pogrupowane według źródeł. – niklas