Django:在ManyToManyField中过滤包含一组值的行

时间:2009-11-07 16:32:34

标签: django orm

我有以下型号:

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

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

并希望get_or_create一个具有完全给定标记集的频道。

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

修改:问题出现在create部分,因为

Channel.objects.get(tags=tags)

工作得很好。所以这是保存多种关系的常见问题。

2 个答案:

答案 0 :(得分:1)

在这种情况下,我认为你不能使用get_or_create。您需要分多步执行此操作:

  1. 过滤您的频道列表,以获取包含完整标签列表的频道(如果有)
  2. 如果列表为空,请创建频道并在创建频道后添加标记并具有ID
  3. 例如:

    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])
    

答案 1 :(得分:0)

如下:

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