使用标签模型创建ManytoMany关系
我试图从表格“UserBookmark”中获取列值“tag”属于列表的数据。
UserBookmark.objects.filter(tag__in = ['Java','Android'])
但是这返回QuerySet [](空集),而我确实有数据匹配此表中的查询
<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
class UserBookmark(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 manae.py后迁移python managepy makemigrations,我得到这个错误:
ValueError:无法将字段bookmark.UserBookmark.tags更改为bookmark.UserBookmark.tags - 它们不是兼容类型(您不能在M2M字段中改变或取消M2M字段,或者在M2M字段中添加或删除通过=)
我在这里做错了什么?
问题不在于您的查询,而在于您存储数据的方式。 你有一个单一的CharField,你似乎通过简单地将一个列表转换为一个字符串来填充它。 因此,您的记录包含例如文字字符串"[u'Data Science,Python']"
。
如果你想存储这种标签,你需要单独存储标签。 一种方法是建立一个单独的标签模型并使用多对多关系。 有各种各样的第三方软件包可以帮助你 - 例如django-taggit。
尝试复数化,也许使用tags__in