2017-07-04 53 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()