2017-12-25 4 views
0

Im Wesentlichen versuche ich ein paar Tabellen zu erstellen, die mit Attributen von pcaps gefüllt sind. Ich erhalte einen ziemlich merkwürdigen Fehler. Dies ist der Code in den Modellen Klasse:Django-Modelle - 'Pcaps.uuid' muss unique = True setzen, da es durch einen Fremdschlüssel referenziert wird

class Pcaps(models.Model): 
    uuid = models.CharField(max_length=50) 
    filename = models.CharField(max_length=200, default='') 
    datetime = models.DateTimeField(default=datetime.now, blank=True) 
    filehash = models.ForeignKey(Malwares, to_field="filehash", 
db_column="filehash") 

class PcapsIps(models.Model): 
    domainname = models.CharField(max_length=100) 
    ip = models.CharField(max_length=100) 
    uuid = models.ForeignKey(Pcaps, to_field="uuid", db_column="uuid") 

class PcapsPorts(models.Model): 
    number = models.CharField(max_length=100) 
    uuid = models.ForeignKey(Pcaps, to_field="uuid", db_column="uuid") 

Der Fehler in Frage lautet wie folgt:

FEHLER:

analyser.PcapsIps.uuid: (fields.E311) 'Pcaps.uuid' must set unique=True 
because it is referenced by a foreign key. 
analyser.PcapsPorts.uuid: (fields.E311) 'Pcaps.uuid' must set unique=True because it is referenced by a foreign key. 
+2

Warum ist es seltsam? Der Fehler ist sehr klar, Fremdschlüssel muss eindeutig sein. –

Antwort

1

Sie müssen verstehen, wie ein Fremdschlüssel arbeitet unter der Haube, dh in welchem ​​Datenbanksystem Sie auch arbeiten. Ein Fremdschlüssel ist ein Feld (oder eine Sammlung von Feldern) in einer Tabelle (entspricht einem Django-Modell), das eine Zeile einer anderen (oder derselben) Tabelle eindeutig identifiziert. Normalerweise geschieht dies mit dem Primärschlüssel, da dies garantiert einmalig ist. Wenn Sie einen Grund dafür haben, können Sie to_field setzen, um auf eine andere Zeile in der anderen Tabelle/dem anderen Modell zu verweisen. Dieses Feld muss jedoch auch eindeutig sein. So müssen Sie:

uuid = models.CharField(unique=True, max_length=50) 

EDIT: Oh, übrigens, wenn Sie mit Django 1.8 oder höher, ist es nun ein UUIDField hat. Siehe here

Verwandte Themen