J'ai essayé de trouver une réponse à ma question pendant un moment, mais je ne trouve pas exactement ce dont j'ai besoin.Les objets filtrés par ManyToManyField_in ne contiennent pas le reste des valeurs de champs ManyToMany, comment les obtenir?
J'ai récemment commencé à jouer avec Django (j'ai recherché les docs), ce qui se passait bien jusqu'à maintenant. Je fais une application de galerie simple, l'idée est simple, chaque image a un tas de tags. Je veux construire une liste de tags (pas là de problème), puis en sélectionnant une étiquette - obtenir une liste des balises connexes à travers toutes les images - là, j'ai un problème, jetez un oeil à mon code de vue:
def getTagList(request):
images = Image.objects.all()
imgsWithTag = images.filter(tags__name__in=["space"]).only('tags')
allTags = imgsWithTag.values_list('tags__name', flat=True)
ici, il est - je m'y attendais Alltags être une liste de toutes les balises d'image (y compris « espace » comme dans l'exemple) - au lieu que je reçois:
[u'space', u'space']
pour les deux images que j'ai dans mon DB. Chaque image contenant deux balises ('espace' étant le commun), mais seule la balise 'appariée' a été renvoyée pour autant que je sache.
Que se passe-t-il exactement ici & comment l'éviter? Y a-t-il une meilleure façon de faire ce que j'essaie de faire?
mes modèles sont les suivants:
class Tag(models.Model):
name = models.CharField(max_length=60, primary_key=True)
def __unicode__(self):
return self.name
class Image(models.Model):
title = models.CharField(max_length=60)
image = models.ImageField(upload_to="images/")
tags = models.ManyToManyField(Tag, blank=True)
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
def thumbnail(self):
return '<img src="%s" height="40" />' % (self.image.url)
thumbnail.short_description = 'Image'
thumbnail.allow_tags = True
def get_tags(self):
return ", ".join([x.name for x in self.tags.all()])
def url(self):
return self.image.url
def __unicode__(self):
return self.title
Merci.
Merci pour votre réponse. Cependant, je n'ai pas de champ associant chaque tag à une liste d'images - cette idée ne me semble pas juste. L'approche Id ne fonctionnera pas dans ce cas également. – Nisk
Oui, sauf si vous avez spécifié 'related_name = '+'' dans le champ ManyToMany liant Image avec Tag. Regardez [docs] (https://docs.djangoproject.com/fr/1.8/ref/models/fields/#django.db.models.ManyToManyField.related_name) – GwynBleidD