首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用django的Self M2M

使用django的Self M2M
EN

Stack Overflow用户
提问于 2017-05-15 12:49:25
回答 1查看 37关注 0票数 0

我正在尝试在同一模型中的self上创建一个M2M值。我可以很好地更新name字段。然而,当我更新M2M (超标签)字段时,我一直得到TypeError

models.py

代码语言:javascript
复制
class Tag(models.Model):
    name = models.CharField("Name", max_length=5000, blank=True)
    supertag = models.ManyToManyField('self', blank=True)

serializers.py

代码语言:javascript
复制
        supe = tag.all()
        print(supe)
        # returns [<Tag: XYZ>, <Tag: 123>]
        for y in supe:
            # import pdb; pdb.set_trace()
            tag = Tag.objects.update(supertag__pk=y.pk)
        tag.save()

错误:

代码语言:javascript
复制
TypeError: 'supertag__pk' is an invalid keyword argument for this function

我还尝试了tag = Tag.objects.update(supertag=supe),它给出了同样的错误

EN

回答 1

Stack Overflow用户

发布于 2017-05-15 13:01:52

supe是一个queryset,它没有pk属性。

此外,您对不同的变量使用相同的名称。标记已被分配。

代码语言:javascript
复制
supe = tag.all()

当将标签分配给新对象时,会影响for循环的工作,该循环基于以前的标签变量。

代码语言:javascript
复制
tag = Tag.objects.get_or_create(supertag__pk=supe.pk)

你不能这么做。

编辑

函数get_or_create实际上返回元组、一个对象和一个布尔标志。布尔标志指定对象是否已创建。所以,你实现的逻辑是错误的。正如我们所讨论的,

你可以这样做,

代码语言:javascript
复制
for x in supe:
    if x.taglevel == 1:
        for value in supe:
            x.tag.add(value)
            x.save()
    else:
        #your next logic
        print("No level 1")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43971758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档