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

Python 在Django中,如何在保存到数据库时返回现有模型实例,python,django,python-3.x,model,tdd,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

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

下面是一些类似于我试图完成的事情:

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

Django模型提供了一个名为
get\u或\u create
的函数,该函数返回对象和一个表示已创建或未创建的标志。i、 e(obj,正确或错误)。 因此,您可以在
保存中执行以下操作

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
您的
人员不也应该继承
模型。模型

更新:


基本上,如果没有名为
AudioFile
的模型,并且您没有在
Personne
中检查关系,那么下一个答案是测试的明智选择。

有许多原因导致您的
save()
方法无法按书面方式工作。(首先,未使用
save()
的返回值,因此
return found
无效。)

但是没有理由自己尝试重新设计:摆脱您的自定义
save()
,只需使用
get\u或\u create()


我并没有得到你们想要实现的东西,但Django模型给出了一个名为
get\u或\u create
的函数,该函数返回object和一个表示是否创建的标志。i、 e(obj,正确或错误)。另外,当
try
失败时,您的
found
将不会被定义。在将该实例保存到数据库之前,我想看看它是否已经存在另一个具有相同“nom”属性的实例。如果存在,我希望create函数返回的不是保存的新实例,而是现有实例。我用好名字编辑了我的问题,AudioFile应该是Personne。不幸的是,这也不起作用。
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)