Django: Problem mit db Model

Django, Flask, Bottle, WSGI, CGI…
Antworten
torres
User
Beiträge: 47
Registriert: Samstag 29. Januar 2011, 13:23

Hallo,

ich bin aktuell am Testen von django und habe das Problem, dass ich im model.py nicht umsetzen kann
was ich gern moechte.

das hier moechte ich gern:

Code: Alles auswählen

CREATE TABLE objekt (
  objekt_id int(4) NOT NULL AUTO_INCREMENT,
  name varchar(80) NOT NULL,
  text varchar(150) DEFAULT NULL,
  anderes varchar(4) DEFAULT NULL,
  PRIMARY KEY (`objekt_id`),
  UNIQUE KEY name (name)) ENGINE=INNODB;

mysql> select * from objekt;
+-----------+-------+------+------------+
| objekt_id | name  | text | anderes |
+-----------+-------+------+------------+
|         1 | bla   | txt  | 1          |
|         2 | blubb | txt  | 1          |
|         3 | foo   | txt  | 1          |
|         4 | bar   | txt  | 1          |
+-----------+-------+------+------------+

CREATE TABLE url (
   url_id int(4) NOT NULL AUTO_INCREMENT,
   selbst int ,
   ziel int,
   x int(4) NOT NULL,
   y int(4) NOT NULL,
   FOREIGN KEY (selbst) REFERENCES objekt(objekt_id),
   FOREIGN KEY (ziel) REFERENCES objekt(objekt_id),
   PRIMARY KEY (url_id)
) ENGINE=INNODB;

mysql> select * from url;
+--------+--------+------+----+----+
| url_id | selbst | ziel | x  | y  |
+--------+--------+------+----+----+
|      1 |      1 |    2 | 45 | 66 |
|      2 |      1 |    3 | 45 | 66 |
|      3 |      1 |    4 | 45 | 66 |
|      4 |      2 |    1 | 45 | 66 |
|      5 |      2 |    3 | 45 | 66 |
+--------+--------+------+----+----+

select distinct
 obj2.objekt_id,
 obj2.name
 from url,
      objekt as obj1,
      objekt as obj2
 where obj1.objekt_id = 1
 and url.selbst = obj1.objekt_id
 and url.ziel = obj2.objekt_id

+-----------+-------+
| objekt_id | name  |
+-----------+-------+
|         2 | blubb |
|         3 | foo   |
|         4 | bar   |
+-----------+-------+
so versuche ich es hinzuschreiben:

Code: Alles auswählen

class objekt(models.Model):
    name = models.CharField(max_length=80, unique=True)
    text = models.CharField(max_length=150, null=True)
    teilgebiet = models.ForeignKey(teilgebiet)
    def __unicode__(self):
        return self.question

class url(models.Model):
    selbst = models.ForeignKey(objekt)
    ziel = models.ForeignKey(objekt)
    x = models.IntegerField()
    y = models.IntegerField()
    def __unicode__(self):
        return self.question
und dann bekomme ich mit python manage.py sql polls folgenden Fehler:

Error: One or more models did not validate:
polls.url: Accessor for field 'selbst' clashes with related field 'objekt.url_set'. Add a related_name argument to the definition for 'selbst'.
polls.url: Accessor for field 'ziel' clashes with related field 'objekt.url_set'. Add a related_name argument to the definition for 'ziel'.

Leider finde ich nicht heraus wie ich das besser machen koennte?
Koennte mir da jemand helfen?

Danke und Gruss,
Sylvia
BlackJack

@torres: Wenn Du ein `ForeignKey` auf ein anderes Model setzt, dann wird dort ja eine Rückreferenz gesetzt. Wenn Du also auf dem Model `ham` einen Fremdschlüsselbeziehung auf das Model `eggs` setzt, dann bekommen `eggs`-Exemplare automatisch eine Beziehung mit dem Namen `ham_set` verpasst. Wenn Du aber nun mehr als eine Fremdschlüssel-Beziehung von einem zum anderen Model setzt, dann können die Rückreferenzen ja nicht alle den gleichen Namen haben und Du musst explizit Namen dafür vergeben. Oder sagen, dass Du keine Rückreferenzen haben möchtest: http://docs.djangoproject.com/en/dev/re ... lated_name

Die Fehlermeldung ist da übrigens IMHO recht hilfreich.
torres
User
Beiträge: 47
Registriert: Samstag 29. Januar 2011, 13:23

Hallo BlackJack,

genau, das hatte ich nicht gefunden. Vielen Dank fuer den Link!

Code: Alles auswählen

class url(models.Model):    
    selbst = models.ForeignKey(objekt,related_name='selbst')
    ziel = models.ForeignKey(objekt,related_name='ziel')
    x = models.IntegerField()
    y = models.IntegerField()
    def __unicode__(self):
        return self.question
Das funktioniert jetzt so.

Vielen Dank!
Gruss
Torres, die Blinde :oops: (hier wurde editiert)
BlackJack

@torres: Wobei die Namen nicht wirklich toll sind.
torres
User
Beiträge: 47
Registriert: Samstag 29. Januar 2011, 13:23

Warum?
Viele Gruesse,
Torres
BlackJack

@torres: Naja, weil sie halt schlecht beschreiben was sich dahinter verbirgt. Das fängt damit an, dass es sich ja nicht um einzelne Werte handelt, sondern eine Rückrereferenz über die man eine Menge von Werten erreichen kann. Darum hiesse ein einzelner, automatisch generierter Name auch `*_set`. An die Namenskonvention würde ich mich mindestens halten. Und das es sich um URLs handelt sollte man IMHO auch im Namen unterbringen. So etwas wie 'ziel_url_set' statt 'ziel'. Wobei mir jetzt nicht so ganz klar ist, was die URLs bezogen auf ein `objekt` bedeuten. Man könnte also vielleicht auch Namen finden, die das deutlich machen. Zum Beispiel 'ausgehende_url_set' und 'eingehende_url_set'. Über das Mischen von deutsch und englisch bei der Namensgebung könnte man bei der Gelegenheit auch mal nachdenken.
torres
User
Beiträge: 47
Registriert: Samstag 29. Januar 2011, 13:23

Hallo BlackJack,
ich glaube, ich komme gar nicht dazu, Auswirkungen von schlechten Benamsungen zu erleben :-(
ich bin so frustriert mit dem django
Gruss,
Torres
Antworten