我有一個模型,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