我有一个模型,Entry.
特别值得注意的是它的addTags
函数,它为Entry
的实例添加一个标记并保存它。下面是类的完整代码:Django ManyToMany平等
class Entry(models.Model):
title = models.CharField(max_length=80)
author = models.ForeignKey(User)
pubdate = models.DateTimeField()
tags = models.ManyToManyField(Tag)
text = models.TextField()
def getAllTags(self):
'''
Returns all tags applied to a given entry
'''
return self.tags.all()
def addTag(self, tagName):
'''
Add a tag to an entry. If tag does not exist, create it. If tag has
already been added, do nothing.
'''
try:
tag = Tag.objects.get(name=tagName)
return tag
except Tag.DoesNotExist:
tag = self.tags.create(name=tagName)
self.save()
return tag
奇怪的是,当我测试用下面的代码的addTag功能(取值范以前创建,是一个有效的Entry对象):
tag1 = entry1.addTag("testtag2")
tag2 = entry1.addTag("testtag2")
tag3 = entry1.addTag("testtag3")
tagList = [tag1, tag2, tag3]
for listTag, objTag in zip(tagList, entry1.tags.all()):
print "%s: %s" % (listTag, objTag)
self.assertEqual(entry1.tags.all(), tagList)
我得到以下断言错误:
AssertionError: [<Tag: testtag>, <Tag: testtag2>, <Tag: testtag3>] != [<Tag: testtag>, <Tag: testtag2>, <Tag: testtag3>]
然而,打印语句中上面的代码给我下面的:
testtag: testtag
testtag2: testtag2
testtag3: testtag3
表明随着预期的标签已创建。看起来好像每个标签对象的不同内存位置都已经创建好了,但我不明白这是怎么回事。思考?
只是一个提示:你可以使用'Tag.objects.get_or_create'而不是此尝试/除块 –
你怎么不看看这可能是这样吗? Django使用每个查询集返回一个模型的新实例。 – XORcist
@Fernando:太棒了。我预计,Django的友善人士可能会预料到这种情况并为其提供代码。 – user1427661