M2M vs. CommaSeperatedField...
Verfasst: Freitag 28. September 2012, 13:53
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:
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):
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:
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)
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)
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)