在Django中如何在保存到数据库时返回现有的模型实例

时间:2013-09-04 02:49:24

标签: python django python-3.x model tdd

如何在将实例保存到数据库之前返回实例?

下面是类似于我想要完成的事情:

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!=无

2 个答案:

答案 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)