2009-11-07 4 views
1

j'ai le modèle suivant:Django: lignes de filtre contenant un ensemble de valeurs dans ManyToManyField

class Channel(models.Model): 
    tags = models.ManyToManyField(Tag) 

class Tag(models.Model): 
    name = models.CharField(primary_key = True) 

Et veulent get_or_create un canal qui a exactement l'ensemble donné des balises.

tags = map(lambda x: Tag.objects.get(name = x), ['tag1', 'tag2']) 
channel = Channel.objects.get_or_create(tags = tags) # Here's the bug 

Modifier: ressemble le problème est avec la partie create, parce

Channel.objects.get(tags=tags) 

fonctionne très bien. Donc, c'est le problème habituel de sauver une relation many-many.

Répondre

0

Qu'en est-il quelque chose comme:

tags = Tag.objects.filter(name__in=['tag1', 'tag2']) 
channel = Channel.objects.get_or_create(tags=tags) 
+0

ne fonctionne pas - il a le même problème que mon code dans la deuxième ligne. Voir mise à jour. –

1

Je ne pense pas que vous pouvez utiliser get_or_create dans ce cas. Vous devez le faire en plusieurs étapes:

  1. vous la liste des chaînes filtre pour obtenir les canaux avec cette liste exacte des balises, s'il y a un
  2. si la liste est vide, créez votre canal et ajouter les balises après le canal est créé et a un ID

Ex:

tags = ['tag1', 'tag2'] 
channel = reduce(lambda channel_filter, x: channel_filter.filter(tags__name=x), tags, Channel.objects) # not checking if only one objetct is returned 
if not channel: 
    channel = Channel() 
    channel.save() 
    map(channel.tags.add, [Tag.objects.get(name = x) for x in tags]) 
Questions connexes