2016-11-16 3 views
1

Versuchen, mit Django (von PHP oder .Net Vergangenheit) in den Griff zu bekommen und es ein wenig herausfordernd zu finden.Django mit UUID Primärschlüssel für den Zugriff auf verknüpfte Modelle

Wenn die folgenden Modelle erstellt hat:

class Member(models.Model): 
    id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False) 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 

    def __str__(self): 
     return self.last_name + ", " + self.first_name 


class Organisation(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    name = models.CharField(max_length=140) 

    def __str__(self): 
     return self.name 



class Membership(models.Model): 
    id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False) 
    member_id = models.ForeignKey('Member', on_delete=models.DO_NOTHING) 
    organisation_id = models.ForeignKey('Organisation', on_delete=models.DO_NOTHING) 
    membership_no = models.CharField(max_length=20) 

    class Meta: 
     unique_together = (("organisation_id", "member_id"), 
         ("organisation_id", "membership_no")) 

    def __str__(self): 
     mbr = Member.objects.get(pk=self.member_id) 
     org = Organisation.objects.get(pk=self.organisation_id) 
     return str(org) + ": " + str(mbr) 

Das Problem tritt auf, wenn ich versuche, die Mitgliedschaft Modelle in Admin anzuzeigen/zu bearbeiten. Ich erhalte den Fehler: TypeError at/admin/Mitgliedschaft/Mitgliedschaft Ausnahmewert: 'Anderson, Roy' ist keine gültige UUID.

Ich verwende Django Version 1.10.3.

Jetzt ist die Zeichenfolge 'Anderson, Roy' zufällig einer der Datenbankeinträge für das Member-Modell und scheint den Wert auszuführen, der von der str-Funktion für das Member-Modell zurückgegeben wird. Ich weiß jedoch nicht, warum es versucht, es als UUID zu verwenden. Ich versuche, String-Werte aus den Member- und Organisationsmodellen zu verwenden, um den Rückgabewert (str-Funktion) für das Membership-Modell zu erstellen. Es scheint, dass es ein Problem in dieser Funktion gibt. Ist das

mbr = Member.objects.get(pk=self.member_id) 

der richtige Weg, die Mitglied für eine bestimmte UUID abzurufen?

Jede Hilfe sehr geschätzt.

Dank

Antwort

2

Das Problem ist in Ihrem _ str _ Methode der Mitglied Modell, wenn Sie den vollständigen Namen eines Datensatzes benötigen Sie eine Methode verwenden, sollten den vollständigen name.Because zurückzukehren _ str _ Methode Gibt beim Aufruf den Standardwert eines Objekts zurück, und Ihr Code gibt den vollständigen Namen des Mitglieds anstelle der ID dieses Mitglieds zurück. Um ID oder UUID zurückzugeben, verwenden Sie _ Unicode _ Methode anstelle von str. So soll der aktualisierte Code wie folgt sein:

class Member(models.Model): 
    id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False) 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 

    def __unicode__(self): 
     return self.id 

    def get_full_name(self): 
     return self.last_name + ", " + self.first_name 

Und dann verwenden Sie diese:

mbr = Member.objects.get(pk=self.member_id) 

UPDATE 1:

Sie auch diese Methode verwenden können, wenn Sie nicht wollen, Ändern der Methode von str in Unicode:

def __str__(self): 
    mbr = Member.objects.get(pk=self.member_id.id) 
    org = Organisation.objects.get(pk=self.organisation_id.id) 
    return str(org) + ": " + str(mbr) 

Sie müssen einfach ID in Ihren Code einfügen, denn im Moment gibt self.member_id ein Objekt zurück, für die Methode get() brauchen Sie nur die ID dieses Objekts.

+0

Wenn ich __str__ ändere, um self.id zurückzugeben, beschwert sich Admin für Mitgliedschaften, dass __str__ keine Zeichenfolge zurückgibt. Wenn ich es ändere, um str (self.id) zurückzugeben, beschwert es sich, dass der zurückgegebene Wert keine UUID ist. Scheint, ich kann nicht gewinnen! Übrigens sagt die gesamte Dokumentation, die ich gefunden habe, dass __str__ eine benutzerfreundliche Zeichenfolge zurückgeben sollte, die das Objekt nicht unbedingt die ID beschreibt. Danke für deine schnelle Antwort. – user917051

+0

Sie sollten die Methode _ _str_ _ nicht verwenden, wenn Sie eine UUID oder ID wünschen. Ich aktualisiere meine Antwort. Benutze stattdessen _ _unicode_ _ Methode. –

+0

Das war es. Die Zugabe der zusätzlichen .id löste das Problem. Vielen Dank und vielen Dank für Ihre schnelle Antwort. Sehr geschätzt. – user917051

Verwandte Themen