Django, Relations

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Hallo,

will mir gerade ein Nachrichten-System in Django einrichten und habe dafür folgende Models.

Code: Alles auswählen

from django.db import models
from django.contrib.auth.models import User
from datetime import datetime


class Message(models.Model):
    sender = models.ForeignKey(User, related_name='outbox')
    recipient = models.ForeignKey(User, related_name='inbox')
    subject = models.CharField(max_length=200)
    content = models.TextField()
    is_read = models.BooleanField(default=False)
    date = models.DateTimeField(default=datetime.now)
    sender_deleted = models.BooleanField(default=False)
    recipient_deleted = models.BooleanField(default=False)
        
    @property
    def date_formatted(self):
        return self.date.strftime('%d.%m.%Y %H:%M')
    
    def __unicode__(self):
        return u'sender:%s, recipient:%s, date:%s' % (
            self.sender,
            self.recipient,
            self.date
        )
Das funktioniert auch wunderbar, nur würde ich gerne für user.inbox oder outbox ein paar erweiterte Einschränkungen machen (in diesem Beispiel soll dann auch sender_deleted bzw. recipient_deleted False sein). Ich kenne das von SQLAlchemy beim mappen mit primaryjoins etc.
Ich bin mir ziemlich sicher, dass dazu was in den Docs steht, konnte es aber nicht finden... Wie macht man sowas oder wo finde ich Infos dazu?

Danke!
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Stichwort sind Manager. Damit kannst du das Standard-Queryset beeinflussen, welches auch von RelationManagern benutzt wird. Hier ein Beispiel:

Code: Alles auswählen

class MessageManager(models.Manager):
    def get_query_set(self):
        return super(MessageManager, self).get_query_set().filter(deleted=True)
    
class Message(models.Model):
    objects = MessageManager()
    ...
Mehr dazu in der Dokumentation.

Stefan
Antworten