문제

우주 정복 게임을 위해 다음과 같은 Models.py의 골격을 고려하십시오.

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()

내가 작업중 인 프로젝트에 대한 많은 데이터 모델이 있으며 다양한 데이터 객체 간의 다소 복잡한 상호 작용을 기반으로 게임 상태를 변경합니다. 데이터베이스에 대한 불필요한 호출을 많이 피하고 싶습니다. 따라서 턴당 한 번은 같은 일을합니다.

  1. 데이터베이스에서 모든 함대, 행성 및 기타 객체를 쿼리하고 파이썬 개체로 캐시
  2. 게임 개체를 처리하고 게임 상태를 해결합니다.
  3. 데이터베이스에 다시 저장하십시오

이 모델은 외국 키 객체를 사용할 때 완전히 분해되는 것 같습니다. 예를 들어, 새로운 함대가 행성을 떠날 때, 나는 다음과 같은 것처럼 보이는 선이 있습니다.

fleet.home.ships -= fleet.ships

이 라인이 실행 된 후, 나는 행성 Fleet.home을 포함하여 각 행성의 선박 수를 변경하는 다른 코드가 있습니다. 불행히도, 위의 라인에서의 변경 사항은 앞서 얻은 행성의 쿼리 세트에 반영되지 않으므로 턴이 끝날 때 모든 행성을 저장하면 Fleet.home의 선박이 덮어 쓰여집니다.

이 상황을 처리하는 더 좋은 방법이 있습니까? 아니면 이것이 모든 Orms가 얼마나 되는가입니까?

도움이 되었습니까?

해결책

Django의 ORM은 AN을 구현하지 않습니다 신원지도 (안에 있습니다 티켓 추적기, 그러나 그것이 시행 될지 또는 언제 시행 될지 명확하지 않습니다. 적어도 하나의 핵심 Django Committer가 있습니다 그것에 대한 반대를 표현했습니다). 즉, 두 개의 다른 쿼리 경로를 통해 동일한 데이터베이스 객체에 도착하면 메모리에서 다른 Python 객체로 작업하고 있습니다.

즉, 디자인 (모든 것을 한 번에 메모리에로드하고 많은 것을 수정 한 다음 끝에 다시 저장 함)은 Django Orm을 사용하여 볼 수 없습니다. 먼저 동일한 객체의 중복 사본으로 많은 메모리 로딩을 낭비하고 두 번째로 실행중인 문제와 같은 문제로 인해 두 번째는 종종 많은 메모리 로딩을 낭비하기 때문입니다.

이러한 문제를 피하기 위해 디자인을 재 작업해야합니다 (한 번에 하나의 쿼리 세트로 만 작업하여 다른 쿼리를 만들기 전에 수정 된 것을 저장하거나 여러 쿼리를로드하면 모든 관계를 수동으로 찾아보십시오. 편리한 속성을 사용하여 외국인을 가로 지르거나 정체성 맵을 구현하는 대체 Python ORM을 사용하십시오. sqlalchemy 하나의 옵션입니다.

이것이 Django의 ORM이 "나쁜"것을 의미하지는 않습니다. 이러한 종류의 문제가 드물게있는 웹 애플리케이션의 경우에 최적화되어 있습니다 (저는 Django와 몇 년 동안 웹 개발을 수행했으며 실제 프로젝트에서 한 번도이 문제를 한 적이 없었습니다). 유스 케이스가 다른 경우 다른 ORM을 선택할 수 있습니다.

다른 팁

이것은 아마도 당신이 찾고있는 것일 것입니다.

https://web.archive.org/web/20121126091406/http://simonwillison.net/2009/may/7/mmalones/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top