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!=NoneDjango模型提供了一个名为
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)