私はDjango 1.11を使用しており、models.pyに以下のコードを入力しています。 makemigrationsでは正常に動作しますが、移行するときは "models.DoesNotExist"というエラーが発生します。django models.DoesNotExist:一致するクエリが存在しません
models.pyのコード:移行をしながら
class RecordType(models.Model):
name = models.CharField(max_length=100, default='out',blank=True, verbose_name="name")
def get_record_type_default():
return RecordType.objects.get_or_create(pk=1)[0].id
class PrimaryCategory(models.Model):
type = models.ForeignKey(RecordType, on_delete=models.PROTECT, default=get_record_type_default, verbose_name="type")
def get_primary_category_default():
return PrimaryCategory.objects.get_or_create(pk=1)[0].id
class SecondaryCategory(models.Model):
primary_category = models.ForeignKey(PrimaryCategory, on_delete=models.PROTECT, default=get_primary_category_default, verbose_name="1st category")
def get_secondary_category_default():
return SecondaryCategory.objects.get_or_create(pk=1)[0].id
class Record(models.Model):
secondary_category = models.ForeignKey(SecondaryCategory, on_delete=models.PROTECT, default=get_secondary_category_default, verbose_name="2nd category")
そして、ここでは、エラーメッセージです:
File "C:\Users\myname\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\query.py", line 464, in get_or_create
return self.get(**lookup), False
File "C:\Users\myname\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\query.py", line 380, in get
self.model._meta.object_name
datacore.models.DoesNotExist: SecondaryCategory matching query does not exist.
外部キーのデフォルト機能を持つことには問題があります。マイグレーションはデータベーストランザクション内で行われ、関連するモデルもリムボーになる可能性があります。 'get_or_create'は通常と同じように動作しません。外部キーをNULLにすることができる移行を最初に作成し、次にnullを使用できない別の移行を作成し、そのデフォルト関数を使用して、この作業を行うことができます。また、マイグレーション・スクリプトの手動を調整して、マイグレーション・ステップの順序を変更することも検討できます。 –
提案していただきありがとうございます。 get_or_create関数にいくつかのバグがあるはずです。私は何度か試してみて、レコードクラスからsecondary_category属性を削除してからマイグレーションを行い、それを元に戻してもう一度マイグレーションすれば、コードが機能します。 – f1ynns5
また、Recordクラスを削除するとコードも機能するので、get_or_createのネストされた呼び出し深度は限られていると思われます。 – f1ynns5