M2M vs. CommaSeperatedField...

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich habe ein Bug in DjangoBB gefixed, der ums "Zeige mit alle ungelesenen Beiträge" dreht.

Dabei ist mir aufgefallen, das es z.Z. so aussieht:

Code: Alles auswählen

class PostTracking(models.Model):
    user = AutoOneToOneField(User)
    topics = JSONField(null=True, blank=True)
    last_read = models.DateTimeField(null=True, blank=True)
Es wird also einmal mit einem Zeitpunkt und einmal mit einer "Liste der gelesenen Themen" gearbeitet. Also alle Beiträge vor dem Zeitpunk gelten als gelesen und alle deren IDs im JSONField sind.
Wenn man "Alle Beiträge als gelesen markieren" nutzt, wird der Zeitpunk "last_read" gesetzt und das "topics" gelöscht.

Um das JSONField geht es mir hier: Eigentlich wäre es ja ein ManyToManyField für diese Aufgabe da. Doch die Befürchtung ist, das man ein riesigen Datenhaufen ansammeln würde.

Das JSONField ist da nun auch nicht so dolle. Effektiver und schneller wäre IMHO so etwas (ungetestet):

Code: Alles auswählen

class IDsField(models.TextField):
    __metaclass__ = models.SubfieldBase

    def to_python(self, value):
        if value:
            value = [int(id) for in value.split(",")]
        return value

    def get_prep_value(self, value):
        if isinstance(value, list):
            value = ",".join(value)
        return super(IDsField, self).get_prep_value(value)
Also eine komma separierten Liste der IDs.


Doch hat jemand Erfahrungen damit, wie M2M im Vergleich zu einer anderen Lösung steht?
Ich denke ja die Datenbank ist genau dafür gemacht, also macht M2M am meisten Sinn.

btw. von der Abfrage her, brauchen wir nicht unbedingt die Objekte. Also auf das ORM kann man hier verzichten. Eine Liste der IDs wird dann so weiter verarbeitet:

Code: Alles auswählen

topics = topics.exclude(id__in=topics_id)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten