2017-08-30 6 views
1

私は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. 
+0

外部キーのデフォルト機能を持つことには問題があります。マイグレーションはデータベーストランザクション内で行われ、関連するモデルもリムボーになる可能性があります。 'get_or_create'は通常と同じように動作しません。外部キーをNULLにすることができる移行を最初に作成し、次にnullを使用できない別の移行を作成し、そのデフォルト関数を使用して、この作業を行うことができます。また、マイグレーション・スクリプトの手動を調整して、マイグレーション・ステップの順序を変更することも検討できます。 –

+0

提案していただきありがとうございます。 get_or_create関数にいくつかのバグがあるはずです。私は何度か試してみて、レコードクラスからsecondary_category属性を削除してからマイグレーションを行い、それを元に戻してもう一度マイグレーションすれば、コードが機能します。 – f1ynns5

+0

また、Recordクラスを削除するとコードも機能するので、get_or_createのネストされた呼び出し深度は限られていると思われます。 – f1ynns5

答えて

-2

オブジェクトを作成するには、次の方法を使用することができます。

get_object_or_404(RecordType, pk=id) 
+0

** "オブジェクト" **によるデータベースレコードを意味する場合、間違っています。 'get_object_or_404'はデータベースにレコードを作成しません。 – ohannes

+0

get_object_or_404はHTTPレスポンスに使用されますが、マイグレーションとは関係ありません。 –

関連する問題