使用 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 模型创建多对多关系的主要内容,如果未能解决你的问题,请参考以下文章