使用标签模型创建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

链接地址: http://www.djcxy.com/p/38685.html

上一篇: Using Tag model to create ManytoMany relationship

下一篇: How to expose some specific fields of model