Seite 1 von 1

Django: Problem mit db Model

Verfasst: Dienstag 22. März 2011, 16:55
von torres
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

Re: Django: Problem mit db Model

Verfasst: Dienstag 22. März 2011, 17:08
von 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.

Re: Django: Problem mit db Model

Verfasst: Dienstag 22. März 2011, 20:11
von torres
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)

Re: Django: Problem mit db Model

Verfasst: Dienstag 22. März 2011, 22:00
von BlackJack
@torres: Wobei die Namen nicht wirklich toll sind.

Re: Django: Problem mit db Model

Verfasst: Mittwoch 23. März 2011, 06:17
von torres
Warum?
Viele Gruesse,
Torres

Re: Django: Problem mit db Model

Verfasst: Mittwoch 23. März 2011, 08:22
von 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.

Re: Django: Problem mit db Model

Verfasst: Mittwoch 23. März 2011, 15:11
von torres
Hallo BlackJack,
ich glaube, ich komme gar nicht dazu, Auswirkungen von schlechten Benamsungen zu erleben :-(
ich bin so frustriert mit dem django
Gruss,
Torres