2017-07-04 110 views
1

我在django中有兩個模型,定義如下。 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)我的查詢應該從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

我不太明白你的第二個問題,'CreativeStatus'表和'Creative'表不相關。但如果'RtdbCreativeStatus'表和'CreativeStatus'有任何相關的方式,你應該發佈相應的模型,以便進一步的問題。 – zaidfazil

+0

@FazilZaid RtbdCreative table是上面的Creative表格,我打算修改名稱,截圖有點舊。我只是想知道查詢在按照您所建議的更新模型後在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

當你對同一個表中添加多個ForeignKeys,你應該重寫你的域的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()