2016-03-23 3 views
1

Als ich die group_cover-Tabelle überprüfte, die von Django erstellt wurde, gab es group_id_id Feld und group_cover Feld. Ich möchte group_id_id zu group_id ändern.Django OneToOneField und ForeignKeyField fügen dem Feld "_id" das Suffix hinzu

models.py

class Group(models.Model): 

    group_id = models.AutoField(primary_key=True) 
    group_name = models.CharField(max_length=50, unique=False, blank=False) 


class Group_Cover(models.Model): 

    group_id = models.OneToOneField(Group, primary_key=True) # this create group_id_id 
    group_cover = models.ImageField(upload_to="/image/group/") 


class Group_Member(models.Model): 

    user_id = models.ForeignKey(User2) # this create user_id_id 
    group_id = models.ForeignKey(Group) # this create group_id_id 

Ja, wenn ich schreibe,

group = models.OneToOneField(Group, primary_key=True) 

Es könnte funktionieren, aber ich kann nicht auf einem Feld "_id" Suffix benötigen.

Ich lese this document, aber aufgrund meiner schlechten Englisch, konnte ich den Weg nicht verstehen. Würden Sie mir bitte beibringen, wie man sich ändert?

Antwort

4

Django fügt den Primärschlüsseln, die automatisch generiert werden, einen _id-Postfix hinzu. Im Allgemeinen brauchen Sie sich keine Gedanken über sie zu machen, es sei denn, Sie verwenden eine ältere Datenbank.

Lösung 2 wäre die, die ich für ein neues Projekt empfehlen würde. Lösung 1 für ältere Datenbanken.

Lösung 1

Ihren vorhandenen Code zu ändern, verwenden Sie das folgende db_column Attribut, wie es Ihnen das Feld in der Datenbank .:

group = models.AutoField(primary_key=True, db_column='group_id') 

Documentation

Lösung zu nennen erlaubt 2

Zu g Wenn die gleichen Ergebnisse zu einer "Django" -Weise führen, lässt Django die Primärschlüssel automatisch generieren und referenziert das Modell in den Schlüsselfeldern OneToOne und Foreign wie unten gezeigt.

class Group(models.Model): 
    group_name = models.CharField(max_length=50, unique=False, blank=False) 

class Group_Cover(models.Model): 
    group = models.OneToOneField(Group) 
    group_cover = models.ImageField(upload_to="/image/group/") 

class Group_Member(models.Model): 
    user = models.ForeignKey(User2) 
    group = models.ForeignKey(Group) 
+0

Danke, Lee. Ich denke, ich muss mein Datenbankdesign ein wenig ändern. Solution2 wäre für meinen Code einfach. Vielen Dank. – yamachan

+0

Kein Problem :) – Lee

+0

Die Klassennamen sollten den Python-Namenskonventionen folgen (z. B. 'GroupCover' anstelle von' Group_Cover' und 'GroupMember' anstelle von' Group_Member') – ray

3

Ihre Annahme ist richtig, Sie müssen Ihre Felder umbenennen, um nicht die _id (d. H. group anstelle von group_id) zu enthalten. Dies wird Ihr "Problem" beheben, aber mehr als alles andere repräsentiert es die Beziehung/das Feld genauer. Sie haben Beziehungen zu einem Modell, keinen Bezug zur ID.

_id ist eine automatische Referenz von django zur Verfügung gestellt, um es einfacher zu machen, nur die _id von einem Modell abzurufen.

Vom documentation

Hinter den Kulissen fügt Django „_id“ auf den Feldnamen der Datenbank Spaltennamen zu erstellen. Im obigen Beispiel hat die Datenbanktabelle für das Automodell die Spalte Hersteller_ID. (Sie können dies explizit durch Angabe von db_column ändern.) Ihr Code sollte jedoch niemals mit dem Namen der Datenbankspalte umgehen müssen, es sei denn, Sie schreiben benutzerdefiniertes SQL. Sie werden immer mit den Feldnamen Ihres Modellobjekts arbeiten.

+1

Als Sie für Ihre Antwort. Ich verstehe. Tails ... Ich mochte Sonic und Tails. – yamachan

+1

@yamachan - Keine Sorge! Tails war immer der coolste! :) – Sayse

+1

Ich mochte das Spiel, Sonic the Hedgehog, obwohl ich das Ziel nicht einmal erreichen konnte ... haha ​​ – yamachan

2

Sie sollten sich keine Sorgen um _id machen, die in der Datenbanktabelle hinzugefügt wird. Sie sollten nicht mit der Datenbank umgehen, wenn Sie ORM in Django verwenden.Außerdem müssen Sie keine ID angeben, es sei denn, es handelt sich um einen speziellen Typ - eine Gruppe von Attributen.
Ich würde es so tun (ich glaube, Sie brauchen nicht, dass viele Klassen):

class Group(models.Model): 
    name = models.CharField(max_length=50, unique=False, blank=False) 
    cover = models.ImageField(upload_to="/image/group/") 
    users = models.ManyToManyField(User2) 

Dann sollten Sie Attribute Zugriff mit Objekt-Notation. Wenn Sie ID möchten, verwenden Sie group.id, wenn Sie Objekt filtern möchten, verwenden Sie Group.objects.filter(id__gt=10) oder Group.objects.get(id=1) usw. Mein Modell sollte genau das tun, was Sie erreichen möchten.

+0

Vielen Dank, Lucas03. Ach echt? Ihr Code sieht viel cleverer aus, vor allem im Bereich Benutzer. Danke für deinen Tipp. – yamachan

Verwandte Themen