Rozważmy następujący szkielet models.py dla gry podboju kosmosu:Django ORM: buforowanie i manipulowanie ForeignKey obiektów
class Fleet(models.Model):
game = models.ForeignKey(Game, related_name='planet_set')
owner = models.ForeignKey(User, related_name='planet_set', null=True, blank=True)
home = models.ForeignKey(Planet, related_name='departing_fleet_set')
dest = models.ForeignKey(Planet, related_name='arriving_fleet_set')
ships = models.IntegerField()
class Planet(models.Model):
game = models.ForeignKey(Game, related_name='planet_set')
owner = models.ForeignKey(User, related_name='planet_set', null=True, blank=True)
name = models.CharField(max_length=250)
ships = models.IntegerField()
mam wiele modeli takich danych do projektu pracuję nad, i ja zmienić stan gry na podstawie nieco skomplikowanych interakcji między różnymi obiektami danych. Chcę uniknąć wiele niepotrzebnych połączeń do bazy danych, więc raz na turę, robię coś
- Query wszystkich flot, planet i innych obiektów z bazy danych i buforować je jako obiekty Pythona
- przetworzyć obiekty gry, rozwiązywanie stan gry
- zapisać je z powrotem w bazie
model ten wydaje się całkowicie rozbić przy użyciu ForeignKey obiektów. Na przykład, kiedy nowa flota odchodzi planetę, mam wiersza, który wygląda mniej więcej tak:
fleet.home.ships -= fleet.ships
Po linia ta biegnie, mam inny kod, który zmienia liczbę statków w każdej z planet, w tym planeta flota.home. Niestety, zmiany dokonane w powyższym wierszu nie znajdują odzwierciedlenia w QuerySet planet, które otrzymałem wcześniej, więc kiedy zapisuję wszystkie planety na końcu tury, zmiany w statkach floty.home zostają nadpisane.
Czy jest jakiś lepszy sposób radzenia sobie z tą sytuacją? A może tak wygląda ORM?
Ładnie zestawione –
Tak, dziękuję bardzo za odpowiedzi informacyjny.Wiem, że to nie oznacza, że ORM Django jest zły; w rzeczywistości opracowałem cały projekt przy użyciu Django, który nie wymaga tego skomplikowanego przetwarzania danych, a ten problem nigdy nie pojawił się, dlatego też miałem taką stratę. –