Ho una domanda che sto cercando di risolvere per un giorno.Django prefetch non ha riscontrato duplicati con il tavolo intermedio
Con i modelli
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)
...
Sto cercando di modellare il mondo di citazioni. con relazioni: uno Source
con molti Quote
s, uno Quote
con molti Tag
s. Il problema è:
- Come posso ottenere tutte le
Tag
s che sono contenuti in unSource
(attraverso i contenutiQuote
s)? - con le query minime possibili.
- con la quantità di volte che sono contenuti in questa fonte
ho provato quello ingenuo senza prefetch correlate, con un metodo di modello di
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)
E nel modello:
{% for tag in source.source_tags|slice:":5" %}
source.quote
{% endfor %}
ora ho
sources = Source.objects.all().prefetch_related('quote_set__tags')
E nel modello non ho idea di come iterare correttamente per ottenere il Tag
s per una fonte, e come vorrei andare a contare loro invece di elencare i tag duplicati.
mal test presto, grazie ancora – niklas
@ user9 Ha funzionato come previsto? – Pratyush
Non riesco a farlo funzionare nel modo previsto. l'elenco di valori ha più volte il valore di origine ... (almeno {% per l'origine nelle origini%} non funziona ..), i risultati non sono raggruppati più per origine – niklas