Django: Model field incrementation

Django, Flask, Bottle, WSGI, CGI…
Antworten
schrodi
User
Beiträge: 16
Registriert: Dienstag 10. Mai 2016, 12:59

Hallo zusammen,

ich brauche ein Modelfield, das abhängig von einem Fremdschlüssel inkrementiert.

Folgendes Model habe ich:

Code: Alles auswählen

class Site(BaseModel):
	customer 	= models.ForeignKey('Customer', related_name="customerSite_related", )
	locations 	= models.ManyToManyField(Location, related_name="location_related")
	
	
	site_id 	= models.CharField(max_length = 13, null=False)
	comment	= models.TextField(default="", null=False, blank=True)
	
	class Meta:
		unique_together = ('customer', 'site_id',)

Die Site_Id ist ein ein-eindeutiger Identifikationsschlüssel:

# Site_ID : 000000.000000
# [customer_pk] . [site_id]

Vor dem Punkt wird der Kunde identifiziert. Hierfür kann ich auf den PK des customer Models zurückgreifen. Vll. verwende ich auch noch ein extra Feld, um die 'Kundennummer' variabel und eventuell manuell pflegbar zu halten.

Nach dem Punkt wird die Site je kunde identifiziert. Diese Zahl soll pro Kunde wieder bei 1 beginnen, also in Abhängigkeit des Kunden inkrementieren. Kann ich diese Inkrementierung im Model automatisieren?

Gruß Schrodi
Zuletzt geändert von Anonymous am Mittwoch 10. Mai 2017, 14:09, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

in deinem Post ist ein Widerspruch: wenn `site_id` pro Kunde gezählt wird, dann kann (und muss) `site_id` nicht eindeutig sein. Du hast ja eine Zählung pro Kunde, also hast du für jeden Kunden mindestens die `1` als Wert drin.

IMHO musst du, um das zu realisieren, die `save()` Methode deines Modells überschreiben. Blueprint:
* höchte `site_id` für den Kunden `custmer` holen
* Wert um 1 erhöhen
* Daten in die DB schreiben

Bei SO gibt's dazu auch eine Lösung (Link). Der Thread ist aber etwas älter. Müsstest halt mal schauen, ob das so bei aktuellen Django-Versionen funktioniert.

Gruß, noisefloor
schrodi
User
Beiträge: 16
Registriert: Dienstag 10. Mai 2016, 12:59

Hi,

so wie ich das beschrieben habe hast du Recht. Die Benennung ist nicht sauber.
Die Site_ID ist im Endeffekt die Kombi aus customer PK und site.site_id (man beachte Groß-Kleinschreibung). Werde die Benennung abändern.

Werde das mit der Save-Methode mal testen. Erscheint mir aber auch der beste Ansatz zu sein.

Werde eine Lösung posten, wenns klappt und wenn nicht melde ich mich auch wieder.

Gruß
Antworten