[django] Model Fragen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
TeeJaay
User
Beiträge: 4
Registriert: Montag 29. Oktober 2007, 13:19

Dienstag 30. Oktober 2007, 15:02

Ich beschäftige mich seit runden 3 Tagen mit Django und will / mache als erste App einen Miniblog basten, nur zu testzwecken. Ich habe mir dafür folgendes Model ausgedacht.

Code: Alles auswählen

from django.db import models

# Create your models here.
class Tag(models.Model):
    name = models.CharField(maxlength=50)
    
    def __str__(self):
        return self.name
    
    class Admin:
        pass

class Article(models.Model):
    title = models.CharField(maxlength=100)
    subtitle = models.CharField(maxlength=100)
    writer = models.CharField(maxlength=50)
    blogtext = models.TextField()
    image = models.ImageField(upload_to='/mymedia/tmp')
    tags = models.ManyToManyField(Tag)
    
    def __str__(self):
        return self.title
    
    class Admin:
        pass

class Comment(models.Model):
    article = models.ForeignKey(Article)
    name = models.CharField(maxlength=50)
    email = models.EmailField()
    url = models.URLField(verify_exists = True)
    commenttext = models.TextField()
    
    def __str__(self):
        return self.name
    
    class Admin:
        pass
Also wirklich super Simpel.

zwecks Dateneingabe sind alle Models für das Admincengter freigeschaltet. Was mir daran jetzt noch nicht gefällt ist das writer Feld im Article Model. Ich möchte für dieses Feld gerne fremdschlüsselbeziehung zur auth_user tabelle herstellen, damit man nicht ständig seinen eigenen Namen aufschreiben muss. Nun meine Frage wie packt man das am Besten an ?

Dann vielleicht eine Frage am Rande. Wie kann man eine bestehende Datenbankstruktur modifizieren. Mit python manage.py syncdb klappt es nicht da man die Tabelle komplett löschen muss um Änderungen zu übernehmen.

MFG Thomas
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 30. Oktober 2007, 18:48

TeeJaay hat geschrieben:Dann vielleicht eine Frage am Rande. Wie kann man eine bestehende Datenbankstruktur modifizieren. Mit python manage.py syncdb klappt es nicht da man die Tabelle komplett löschen muss um Änderungen zu übernehmen.
Gar nicht. Django unterstützt das nicht. Ich habe Django auf PostgreSQL laufen, da kann ich mit `ALTER TABLE` dran rumdrehen. Oder du nutzt entsprechend 3rd-Party Produkte wie dbMigrations.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
rafael
User
Beiträge: 189
Registriert: Mittwoch 26. Juli 2006, 16:13

Dienstag 30. Oktober 2007, 19:24

Erstell eine Tabelle "User" und setz dann einen ``ForeignKey`` von der Article-Tabelle zur User-tabelle.
TeeJaay
User
Beiträge: 4
Registriert: Montag 29. Oktober 2007, 13:19

Dienstag 30. Oktober 2007, 19:33

gleiches habe ich mir auch schon gedacht, ich will aber keine neue usertabelle erstellen, sondern einfach nur die auth_user Tabelle und deren daten verwenden.

es reicht aber nicht

from django.contrib.auth.models import User


zu importieren um dann die Userklasse zu verwenden.

writer = models.ForeignKey(User, to_field='id')

Von der FAQ Seite
If I make changes to a model, how do I update the database?

If you don’t mind clearing data, your project’s manage.py utility has an option to reset the SQL for a particular application:

manage.py reset appname

This drops any tables associated with appname and recreates them.

If you do care about deleting data, you’ll have to execute the ALTER TABLE statements manually in your database. That’s the way we’ve always done it, because dealing with data is a very sensitive operation that we’ve wanted to avoid automating. That said, there’s some work being done to add partially automated database-upgrade functionality.
update
hab mich jetzt ewig durch die Doku gewühlt und ich finde immo keinen gescheiten Ansatz. Bin leider auch ein python noob, sodass ich wohl erstmal nen python crashkurs machen muss, Studium is lang her und da hab ich bei python wohl nicht aufgepasst :(.
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Dienstag 30. Oktober 2007, 22:01

TeeJaay hat geschrieben:gleiches habe ich mir auch schon gedacht, ich will aber keine neue usertabelle erstellen, sondern einfach nur die auth_user Tabelle und deren daten verwenden.

es reicht aber nicht

from django.contrib.auth.models import User


zu importieren um dann die Userklasse zu verwenden.

writer = models.ForeignKey(User, to_field='id')
Es geht definitiv so:

Code: Alles auswählen

from django.contrib.auth.models import User
....
   writer=models.ForeignKey(User)
Und sicherheitshalber solltest dann noch die Tabelle (die writer enthält) droppen und neu anlegen...
Von der FAQ Seite
If I make changes to a model, how do I update the database?

If you don’t mind clearing data, your project’s manage.py utility has an option to reset the SQL for a particular application:

manage.py reset appname

This drops any tables associated with appname and recreates them.

If you do care about deleting data, you’ll have to execute the ALTER TABLE statements manually in your database. That’s the way we’ve always done it, because dealing with data is a very sensitive operation that we’ve wanted to avoid automating. That said, there’s some work being done to add partially automated database-upgrade functionality.
update
hab mich jetzt ewig durch die Doku gewühlt und ich finde immo keinen gescheiten Ansatz. Bin leider auch ein python noob, sodass ich wohl erstmal nen python crashkurs machen muss, Studium is lang her und da hab ich bei python wohl nicht aufgepasst :(.
Wie gesagt Tabelle händisch löschen und erneut syncdb ausführen. Django bietet out of the box keinen Weg an um eine Tabelle zu ändern (zum Glück)
Antworten