1

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

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

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

4

2 回答 2

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

如果这不起作用,你可以做

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那么下一个答案是测试的明智选择。

于 2013-09-04T03:09:43.950 回答
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)
于 2013-09-04T06:31:14.487 回答