繁体   English   中英

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

[英]In Django how to return an existing model instance when saving to database

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

下面是与我要完成的操作类似的操作:

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

Django模型提供了一个名为get_or_create的函数,该函数返回object和一个标记为created或not的标志。 即(obj,True或False)。 因此,您可以做的就是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检查关系,则下一个答案是测试的明智选择。

有多种原因导致您的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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM