如何在将实例保存到数据库之前返回实例?
下面是类似于我想要完成的事情:
class Personne(models.Model):
nom = models.CharField(max_length=100, verbose_name="Origem")
def save(self, *args, **kwargs):
found = None
try:
found = Personne.objects.get(nom=self.nom)
super(Personne, self).save(*args, **kwargs)
except AudioFile.DoesNotExist:
return found
def test_personne_is_the_same(self):
p1 = Personne.objects.create(nom="Malcom X")
p2 = Personne.objects.create(nom="Malcom X")
self.assertEqual(p1, p2)
断言给出: p1!=无
答案 0 :(得分:1)
Django模型提供了一个名为get_or_create
的函数,它返回对象和一个标记,表示创建与否。即(obj,真或假)。
所以你在save
可以做的是。
found, created = AudioFile.objects.get_or_create(nom=self.nom)
if created:
super(Personne, self).save(*args, **kwargs)
return found
如果这个doenot工作,你可以做
try:
found = AudioFile.objects.get(nom=self.nom)
except AudioFile.DoesNotExist:
found = AudioFile(nom=self.nom)
found.save()
super(Personne, self).save(*args, **kwargs)
return found
也不应该Personne
继承models.Model
?
更新:
基本上如果没有名为AudioFile
的模型且您没有在Personne
中检查关系,则下一个答案是测试的明智选择。
答案 1 :(得分:1)
您的save()
方法无法按照书面形式工作的原因有很多。 (例如,save()
的返回值未使用,因此return found
无效。)
但是没有理由尝试自己重新设计:摆脱自定义save()
并使用get_or_create()
:
def test_personne_is_the_same(self):
p1, _ = Personne.objects.get_or_create(nom="Malcom X")
p2, _ = Personne.objects.get_or_create(nom="Malcom X")
self.assertEqual(p1, p2)