![](/img/trans.png)
[英]How can I avoid ProgrammingError: can't adapt type 'DateTimeRangeField' when saving a Django model instance to a remote database?
[英]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.