Jak ustawić wartość domyślną dla pola, które ma zostać pobrane z istniejących obiektów modelu?Django: domyślna wartość pola z instancji własnego modelu
Próbowałem to i to nie działało:
1)
class ModelA(models.Model):
fieldA = models.CharField(default=self.get_previous())
def get_previous(self):
return ModelA.objects.all()[0].fieldA
NameError: name 'self' is not defined
2)
class ModelA(models.Model):
fieldA = models.CharField(default=ModelA.get_previous())
@staticmethod
def get_previous():
return ModelA.objects.all()[0].fieldA
NameError: name 'ModelA' is not defined
3)
class ModelA(models.Model):
fieldA = models.CharField(default=get_previous())
def get_previous():
return ModelA.objects.all()[0].fieldA
NameError: global name 'get_previous' is not defined
4)
def get_previous():
return ModelA.objects.all()[0].fieldA
class ModelA(models.Model):
fieldA = models.CharField(default=get_previous())
NameError: global name 'ModelA' is not defined
I to jest jasne, dlaczego 3) i 4) nie będzie działać. Mogę sobie wyobrazić, dlaczego 1) nie zadziała - wygląda na to, że cechy klasy nie mogą odnosić się do instancji (to znaczy do jaźni). Mogę sobie wyobrazić, dlaczego 2) nie zadziała - najwyraźniej nie ma odniesienia do Modelu A, dopóki tłumacz nie przejdzie przez całą klasę.
Jak powinienem to zrobić?
Dobra uwaga! W moim przypadku jednak mam wiele pól, aby uzyskać domyślną wartość, więc potrzebowałbym osobnej funkcji dla każdego z nich. (Ale rozważę użycie lambda do uogólnienia tego, coś jak 'lambda: get_default ('field_name')') – grucha
Równoważnie, powinieneś być w stanie zrobić 'default = lambda: ModelA.objects.all() [0]. poleA'. –
Należy pamiętać, że użycie domyślnej funkcji lambda spowoduje bałagan z migracjami, ponieważ funkcji lambda nie można serializować. – Ironbeard