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、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、次の答えはテストするのに賢明な選択です。

于 2013-09-04T03:09:43.950 に答える
1

save()メソッドが記述どおりに機能しない理由はいくつかあります。(1 つは、 の戻り値が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 に答える