どんな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"
}
}
- 納得しました。
参考にした記事