Chcę utworzyć obiekt modelowy, taki jak Osoba, jeśli identyfikator osoby nie istnieje, lub otrzymam obiekt tej osoby.
Kod do utworzenia nowej osoby w następujący sposób:
class Person(models.Model):
identifier = models.CharField(max_length = 10)
name = models.CharField(max_length = 20)
objects = PersonManager()
class PersonManager(models.Manager):
def create_person(self, identifier):
person = self.create(identifier = identifier)
return person
Ale nie wiem, gdzie sprawdzić i pobrać istniejący obiekt osoby.
python
django
django-models
user1687717
źródło
źródło
QuerySet
że takupdate_or_create
Nie jest jasne, czy twoje pytanie dotyczy metody get_or_create (dostępnej co najmniej od Django 1.3) czy metody update_or_create (nowość w Django 1.7). To zależy od tego, jak chcesz zaktualizować obiekt użytkownika.
Przykładowe użycie jest następujące:
źródło
update_or_create
ponieważ w tym przypadku użycia lepiej niżget_or_create
po prostu ponownie wywołaćsave()
obiekt.Person.objects.get_or_create(a=a, b=b, c=c, defaults={"name": name})
defaults
argumentem tych funkcji jest miejsce, w którym określasz, jakie pola chcesz dodać do modelu. Nie ma to nic wspólnego z wartościami domyślnymi określonymi w polach twojego modeluDjango obsługuje to, sprawdź get_or_create
źródło
Tylko w przypadku niewielkiej liczby obiektów update_or_create działa dobrze, ale jeśli robisz na dużej kolekcji, nie będzie dobrze skalować. update_or_create zawsze najpierw uruchamia SELECT, a następnie UPDATE.
W najlepszym przypadku spowoduje to uruchomienie tylko pierwszego zapytania aktualizującego i tylko wtedy, gdy pasuje do zerowych wierszy, uruchomi kolejne zapytanie INSERT. Co znacznie zwiększy wydajność, jeśli spodziewasz się, że większość wierszy faktycznie istnieje.
Wszystko sprowadza się jednak do twojego przypadku użycia. Jeśli spodziewasz się głównie wstawień, być może polecenie bulk_create () może być opcją.
źródło
Pomyślałem, że dodam odpowiedź, ponieważ tytuł twojego pytania wygląda tak, jakby pytał, jak utworzyć lub zaktualizować, zamiast pobierać lub tworzyć zgodnie z opisem w treści pytania.
Jeśli chcesz utworzyć lub zaktualizować obiekt, metoda .save () ma już to zachowanie domyślnie, z dokumentów :
Warto zauważyć, że kiedy mówią „jeśli UPDATE niczego nie zaktualizował”, zasadniczo odnoszą się do przypadku, w którym identyfikator, który nadałeś obiektowi, nie istnieje już w bazie danych.
źródło
Jeśli jednym z danych wejściowych podczas tworzenia jest klucz podstawowy, wystarczy:
Zaktualizuje się automatycznie, jeśli istnieje, ponieważ dwa dane z tym samym kluczem podstawowym są niedozwolone.
źródło