2017-07-04 26 views
1

以下の定義のdjangoには2つのモデルがあります。 CreativeStatusモデル:djangoの複数のフィールドの外部キー

class RtbdCreativeStatus(models.Model): 
    creative_id = models.CharField(max_length=500, primary_key=True) 
    advertiser_id = models.CharField(max_length=100, primary_key=True) 
    exposure_level = models.CharField(max_length=125) 
    modified_on = models.DateTimeField() 
    modified_by = models.CharField(max_length=100) 


class RtbdCreative(models.Model): 
    id = models.AutoField(primary_key=True) 
    advertiser_id = models.ForeignKey(RtbdCreativeStatus, on_delete=models.CASCADE) 
    creative_id = models.ForeignKey(RtbdCreativeStatus, on_delete=models.CASCADE) 
    country_id = models.IntegerField() 
    adm = models.CharField(max_length=255, null=True, blank=True) 
    sample_url = models.CharField(max_length=500) 
    landing_page = models.CharField(max_length=500, null=True, blank=True) 
    html = models.CharField(max_length=500) 
    creative_attributes = models.CommaSeparatedIntegerField(max_length=150, null=True, blank=True) 
    advertiser_domains = models.CharField(max_length=500) 
    description = models.CharField(max_length=500, null=True, blank=True) 
    created_on = models.DateTimeField(auto_now=True, auto_now_add=True) 
    creative_type = models.CharField(max_length=50, null=True, blank=True) 
    demand_source_type_id = models.IntegerField() 
    revalidate = models.BooleanField(default=False) 

(CREATIVE_ID、ADVERTISER_ID)の組み合わせは、私のCreativeStatusテーブル内で一意です。その組み合わせをCreativeテーブルの外部キーにしたい。私はそれを追加しようとしたが、私はこのエラーが発生します。 Screenshot of the error in django

1)外部キーとして2つのキーの組み合わせでこの結合を達成するにはどうすればよいですか。

2)ステータスがCreativeStatusテーブルのすべてのクリエイティブを取得するためのクエリは何ですか。

UPDATE 1

以下の回答を読んで後述するように、私は私のモデルを更新:

class RtbdCreative(models.Model): 
    id = models.AutoField(primary_key=True) 
    advertiser_id = models.ForeignKey(RtbdCreativeStatus, to_field='advertiser_id', related_name='advertiser', db_column='advertiser_id', on_delete=models.CASCADE) 
    creative_id = models.ForeignKey(RtbdCreativeStatus, to_field='creative_id', related_name='creative', db_column='creative_id', on_delete=models.CASCADE) 
    country_id = models.IntegerField() 
    adm = models.CharField(max_length=255, null=True, blank=True) 
    sample_url = models.CharField(max_length=500) 
    landing_page = models.CharField(max_length=500, null=True, blank=True) 
    html = models.CharField(max_length=500) 
    creative_attributes = models.CommaSeparatedIntegerField(max_length=150, null=True, blank=True) 
    advertiser_domains = models.CharField(max_length=500) 
    description = models.CharField(max_length=500, null=True, blank=True) 
    created_on = models.DateTimeField(auto_now=True, auto_now_add=True) 
    creative_type = models.CharField(max_length=50, null=True, blank=True) 
    demand_source_type_id = models.IntegerField() 
    revalidate = models.BooleanField(default=False) 

今、私はこのエラーenter image description hereを取得しています。私はadvertiser_id、craetive_idの組み合わせがユニークです。しかし、djangoは、両方がユニークであることを期待しています。私はそれを動作させるために何をすることができますか?

+0

私は2番目の質問をよく理解していませんでした。「CreativeStatus」テーブルと「Creative」テーブルは関連していません。しかし、 'RtdbCreativeStatus'テーブルと' CreativeStatus'が何らかの方法で関係している場合は、さらなる質問のためにそれぞれのモデルを投稿する必要があります.. – zaidfazil

+0

@FazilZaid RtbdCreativeテーブルは上記のクリエイティブテーブルです、私は名前を変更する予定です、スクリーンショットは少しです古い。私はちょうどdjango –

答えて

1

ERRROSで述べたように、同じモデルに複数の外部キーを追加する場合は、引数としてrelated_nameを追加する必要があります。

class Creative(models.Model): 
    id = models.AutoField(primary_key=True) 
    advertiser_id = models.ForeignKey(RtbdCreativeStatus, 
             related_name="Advertiser", on_delete=models.CASCADE) 
    creative_id = models.ForeignKey(RtbdCreativeStatus, 
            related_name="Creative", 
            on_delete=models.CASCADE) 
    country_id = models.IntegerField() 
    adm = models.CharField(max_length=255, null=True, blank=True) 
    sample_url = models.CharField(max_length=500) 
    landing_page = models.CharField(max_length=500, null=True, blank=True) 
    html = models.CharField(max_length=500) 
    creative_attributes = models.CommaSeparatedIntegerField(
     max_length=150, null=True, blank=True) 
    advertiser_domains = models.CharField(max_length=500) 
    description = models.CharField(max_length=500, null=True, blank=True) 
    created_on = models.DateTimeField(auto_now=True, auto_now_add=True) 
    creative_type = models.CharField(max_length=50, null=True, blank=True) 
    demand_source_type_id = models.IntegerField() 
    revalidate = models.BooleanField(default=False) 
+0

であなたが提案したようにモデルを更新した後に両方のテーブルにアクセスするクエリを知りたい、私は新しいエラーを取得しています。私は両方のフィールドが一意である必要はありません。私は彼らのユニークな組み合わせを持っています。どのように私はこれを動作させることができますか? –

0

あなたが同じテーブルに向けて複数のForeignKeyを追加する場合のフィールドは、容易に区別できるように、あなたは、あなたの分野のrelated_nameオプションをオーバーライドする必要があります。あなたは、creative_idadvertiser_idの一意性をチェックするため

class Creative(models.Model): 
    advertiser_id = models.ForeignKey(CreativeStatus, 
            related_name="advertisers") 
    creative_id = models.ForeignKey(CreativeStatus, 
           related_name="creatives") 

    def clean(self): 
     data = self.cleaned_data 
     if not data['advertiser_id'] == data['creative_id']: 
      raise ValidationError("Unique Constraint failed {}, {}".format(self.advertiser_id, self.creative_id)) 
     return data 

をカスタム検証を実装することができ

あなたは、関連する名前を使用してCreativeStatusからクリエイティブを問い合わせることができます。

creative_status_obj = CreativeStatus.objects.get(pk=some_pk)#or any query. 
#All creatives of the given object can be queried using reverse relation. 
creatives = creative_status_obj.creatives.all() 
関連する問題