1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

1対多なリレーションがUUIDなモデルに対して向いているときのFixtureの書き方

Posted at

どんなFixtureを生成させたいか

  • モデル定義部分を見ていただくのが早いかと思います。
  • AとBは1対多の関係でBモデルはAクラスへの参照フィールドを保持しています。
class A(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    a = models.CharField(max_length=100)

class B(models.Model):
    b = models.CharField(max_length=200)
    a = models.ForeignKey(A, on_delete=models.CASCADE)
  • ポイントは、A.idはUUIDで定義されているところです。デフォルトのintであれば以下のように簡単にfixtureを定義できます。
{
    "model": "A",
    "pk": 1,
    "fields": {
        "a": "aモデルです"
    }
},
{
    "model": "B",
    "pk": 1,
    "fields": {
        "b": "bモデルです",
        "a": 1 # pk=1のAモデルへのリレーション
    }
}
  • ただ、同じようなことをUUIDなidで行うとうまくいきません
{
    "model": "A",
    "id": "c5ecbde1-cbf4-11e5-a759-6096cb89d9a0",
    "fields": {
        "a": "aモデルです"
    }
},
{
    "model": "B",
    "pk": 1,
    "fields": {
        "b": "bモデルです",
        "a": "c5ecbde1-cbf4-11e5-a759-6096cb89d9a0"
    }
}
django.db.utils.IntegrityError: ...
DETAIL:  Key (a_id)=(c5ecbde1-cbf4-11e5-a759-6096cb89d9a0) is not present in table "a".

解決法

  • pkというフィールドなんかモデルに定義していないのに!と思っていましたが、pkというフィールド名はそもそもdjangoでは予約語であり、primary_key=Trueなフィールドへのエイリアスとしてふるまうみたいです。
{
    "model": "A",
    // idではなくpkにする
    "pk": "c5ecbde1-cbf4-11e5-a759-6096cb89d9a0",  
    "fields": {
        "a": "aモデルです"
    }
},
{
    "model": "B",
    "pk": 1,
    "fields": {
        "b": "bモデルです",
        "a": "c5ecbde1-cbf4-11e5-a759-6096cb89d9a0"
    }
}
  • 納得しました。

参考にした記事

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?