Seite 1 von 1

Django: Model field incrementation

Verfasst: Mittwoch 10. Mai 2017, 13:31
von schrodi
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

Re: Django: Model field incrementation

Verfasst: Donnerstag 11. Mai 2017, 07:03
von noisefloor
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

Re: Django: Model field incrementation

Verfasst: Donnerstag 11. Mai 2017, 12:05
von schrodi
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ß