2017-07-04 1 views
1

Ich habe zwei Modelle in Django mit Definitionen unten. CreativeStatus Modell:Mehrere Feld Fremdschlüssel in 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, werbetreibenden_id) Kombination ist einzigartig in meinem CreativeStatus Tisch. Ich möchte, dass diese Kombination mein Fremdschlüssel für Creative Table ist. Ich habe versucht, es hinzuzufügen, aber ich bekomme diesen Fehler. Screenshot of the error in django

1) Wie erreiche ich diese Verbindung mit zwei Tastenkombination als mein Fremdschlüssel.

2) Wie lautet meine Abfrage, um alle Creatives mit ihrem Status aus der CreativeStatus-Tabelle abzurufen.

UPDATE 1

auf die Antworten unten zu lesen, ich mein Modell aktualisiert, wie unten erwähnt:

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) 

Jetzt diesen Fehler i enter image description here bin immer. Ich habe die Kombination advertiser_id, craetive_id als einzigartig. Aber Django erwartet, dass beide einzigartig sind. Was kann ich tun, damit es funktioniert?

+0

Ich habe Ihre zweite Frage nicht ganz verstanden, 'CreativeStatus' Tabelle und' Creative' Tabelle sind nicht verwandt. Aber wenn "RtdbCreativeStatus" -Tabelle und "CreativeStatus" irgendwie verwandt sind, sollten Sie die entsprechenden Modelle für weitere Fragen veröffentlichen. – zaidfazil

+0

@FazilZaid RtbdCreative Tabelle ist Creative-Tabelle oben, ich plane, den Namen zu chgnagen, der Screenshot ist ein bisschen alt. Ich möchte nur die Abfrage kennen, um auf beide Tabellen nach dem Beitritt in Django –

Antwort

1

Wie in ERRROS erwähnt, müssen Sie related_name als Argument hinzufügen, wenn Sie mehr als einen Fremdschlüssel für dasselbe Modell hinzufügen möchten.

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

nach Aktualisierung des Modells zugreifen, wie von Ihnen vorgeschlagen, bekomme ich einen neuen Fehler. Ich habe nicht beide Felder, um einzigartig zu sein. Ich habe ihre Kombination einzigartig. Wie kann ich das zum Laufen bringen? –

0

Wenn Sie mehrere Foreign auf derselben Tabelle hinzufügen möchten, sollten Sie die Option related_name Ihrer Felder außer Kraft setzen, so dass die Felder leicht unterschieden werden konnten.

Sie könnten eine benutzerdefinierte Validierung zur Überprüfung Einzigartigkeit des creative_id und advertiser_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 

implementieren Sie Ihre Motive von CreativeStatus den zugehörigen Namen mit nicht abfragen.

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() 
Verwandte Themen