Mam model Django o nazwie StaffSettings, który zawiera różne opcje konfiguracji dla użytkowników w mojej aplikacji Django. Każdy użytkownik ma najwyżej jedną pozycję w tabeli StaffSettings.Czy istnieje idiomatyczny sposób na get_or_create, a następnie aktualizację obiektu w Django?
Załóżmy, że jedno ustawienie jest default_year_level i mam kod dla mojego użytkownik obiekty jak:
def set_default_year_level(u, year_level):
obj, _created = StaffSettings.objects.get_or_create(user=u)
obj.default_year_level = year_level
obj.save()
wolałbym ciało funkcji, aby zmieścić się na jednej linii, ponieważ wydaje się, że przypadku wspólnego użytku, ale jeśli zdefiniowano ją jako
def set_default_year_level(u, year_level):
StaffSettings.objects.filter(user=u).update(default_year_level=year_level)
który działa dobrze, jeśli użytkownik posiada już wiersz w tabeli StaffSettings, ale nie stworzy odpowiedni wiersz, jeśli nie istnieje.
Jaki jest idiomatyczny/najlepszy sposób, aby to zakodować? Czy istnieje jakiś rodzaj funkcji tworzenia dekoratorów/pomocników do obsługi tego idiomu?)
Dziękuję za wzmiankę o niedociągnięciu z aktualizacją(). Chyba przeczytałem to kiedyś, ale zapomniałem. Zrobiłem coś podobnego do tego, co zaproponowałeś, ale zamiast tego ustawiłeś set_default_values (u, ** kwargs), tak, że nie muszę przekazywać ciągu znaków dla pola, i zamiast tego mogę napisać kod taki jak set_default_values (u, default_year_level = year_level) . – bryn