2

DjangoでGenericForeign Relationsを使って作業しているときに、間違っているか、または一意制約を処理する際に問題があるかどうかはわかりません。generictogetherをDjangoに追加する方法

オブジェクト(管理者など)を保存しようとすると、ユニークな制約エラー(500件発生)のフォームデータベースがありますが、管理者(UI)のValidationErrorではありません。以下は

私のコードスニペットは、発生した例外

class MyModel(models.Model): 
    name = models.CharField(max_length=60, db_index=True) 
    targeting = GenericRelation('Targeting') 

、私はそれをされて使用して

class Targeting(models.Model): 

    TARGETING_CHOICES = (
     ('geo', "Geo targeting"), 
     ('other', "Other targeting"), 
    ) 

    targeting_type = models.CharField(max_length=64, choices=TARGETING_CHOICES, null=False) 
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) 
    object_id = models.PositiveIntegerField() 

    content_object = GenericForeignKey('content_type', 'object_id') 

    class Meta: 
     unique_together = ('content_type', 'object_id', 'targeting_type') 

そして、私の他のモデル、以下のように1つの汎用関係モデルを持って、

です:

duplicate key value violates unique constraint "mymodel_targeting_targeting_type_0dff10ee_uniq" DETAIL: Key (targeting_type, content_type_id, object_id)=(geo, 18, 188) already exists.

実装方法に問題がありますか?何かがこれのように使われることを意図していないのですか?

本当にありがとうございます。ありがとう

答えて

0

ここでValidationErrorを受け取ることはできません。追加クエリなしで検証することはできず、djangoは単独でそのクエリを作成しないためです。その検証が必要な場合は、自分で作成する必要があります。

-1

unique_togetherのメタ内の唯一の効果は、対応する移行を実行するときにデータベースに追加された制約であるため、例外が発生しています。しかし、Djangoはこの制約を関連する形式でチェックすることはしません(基本的にデータベースのクエリを意味するため)。したがって、実行しようとしている操作はDjangoにとってまったく問題ないようで、ORMに渡されます.ORMはデータベースに格納することができず、例外をスローします。ユーザーが既存の値を入力しないようにするには、この値を自分で検証する必要があります。

関連する問題