使用 Tag 模型创建多对多关系

Posted

技术标签:

【中文标题】使用 Tag 模型创建多对多关系【英文标题】:Using Tag model to create ManytoMany relationship 【发布时间】:2018-05-03 21:26:19 【问题描述】:

我正在尝试从表“UserBookmark”中获取列值“tag”属于列表的数据。

  UserBookmark.objects.filter(tag__in = ['Java','android'])

但这会返回 QuerySet[](null set) 而我在表中确实有与此查询匹配的数据

<QuerySet [<UserBookmark: 21 user12 http://careers.bankofamerica.com/ [u'Java']>,<UserBookmark: 22 user12 http://aehlke.github.io/tag-it/examples.html [u'Data Science,Python']>,<UserBookmark: 23 user13 https://github.com/Azure/azure-quickstart-templates [u'Android']>, <UserBookmark: 24 user14 https://github.com/sunnykrGupta/Bigquery-series [u'Python']>, <UserBookmark: 25 user14 https://github.com/ctfs/write-ups-2017 [u'Data Analytics']>]>

models.py

class UserBookmark(models.Model):
    user = models.ForeignKey(User)
    bookmark = models.URLField()
    tag = models.CharField(max_length = 100)

    def __str__(self):
        return '%i %s %s %s'%(self.id,self.user,self.bookmark,self.tag)

我修改了我的models.py

类用户书签(models.Model):

user = models.ForeignKey(User)
bookmark = models.URLField()
tags = models.ManyToManyField('Tag',blank=True)

def __str__(self):
    return '%i %s %s'%(self.id,self.user,self.bookmark)

类标签(models.Model):

name = models.CharField(max_length=100, unique=True)

但是当我在 python managepy makemigrations 之后运行 python manae.py migrate 时,我得到了这个错误:

ValueError:无法将字段 bookmark.UserBookmark.tags 更改为 bookmark.UserBookmark.tags - 它们不是兼容的类型(您无法更改 M2M 字段或从 M2M 字段更改,或通过 = 在 M2M 字段上添加或删除)

我在这里做错了什么?

【问题讨论】:

你能展示你的模型吗? @ClémentDenoix 是的,我在问题中添加了我的 models.py。请检查 【参考方案1】:

尝试复数,可能使用tags__in

【讨论】:

没有,因为字段名是标签而不是标签 你能发布你的models.py文件吗 是的,我在我的问题中添加了这一点。【参考方案2】:

问题不在于您的查询,而在于您存储数据的方式。您有一个 CharField,您似乎只是通过将列表转换为字符串来填充它。因此,您的记录包含例如文字字符串"[u'Data Science,Python']"

如果你想存储这种标签,你需要单独存储标签。一种方法是建立一个单独的标签模型并使用多对多关系。有多种第三方软件包可以为您执行此操作 - 一个示例是 django-taggit。

【讨论】:

我会调查的。谢谢 :) 另外,如果你使用postgreSQL作为数据库,你可以使用ArrayField:docs.djangoproject.com/en/1.11/ref/contrib/postgres/fields/… @ClémentDenoix 不,我正在使用 Sqlite

以上是关于使用 Tag 模型创建多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

多对多到 MorphToMany 关系

与backbone.js的多对多关系事件

如何插入多对多记录数据?

Django:如何聚合/注释多对多关系?

MySQL查询多对多关系:联合?

如何处理淘汰视图模型中的多对多关系