オブジェクトがまだ存在しない場合のデフォルト値であるリバースリレーションシップを照会する簡単な方法はありますか?関連オブジェクトまたはデフォルト
例をあげて詳しく説明します。
私は、次の基本的なモデルのモデルを持っている:
class Delegation(models.Model):
name = models.CharField(unique=True,max_length=4)
country = models.CharField(unique=True,max_length=100)
members = models.ManyToManyField(User, blank=True)
class Exam(models.Model):
name = models.CharField(max_length=100, unique=True)
active = models.BooleanField(default=True)
は、今私は(提出)アクションはまだ進行中であるか確定基本的にあれば、いくつかのアクションに関する情報を格納する必要があります。このため、私は両方のモデルにリンクするモデルを使用します。
class ExamAction(models.Model):
OPEN = 'O'
SUBMITTED = 'S'
STATUS_CHOICES = ((OPEN, 'In progress'), (SUBMITTED, 'Submitted'))
TRANSLATION = 'T'
POINTS = 'P'
ACTION_CHOICES = ((TRANSLATION, 'Translation submission'), (POINTS, 'Points submission'))
exam = models.ForeignKey(Exam)
delegation = models.ForeignKey(Delegation)
action = models.CharField(max_length=2, choices=ACTION_CHOICES)
status = models.CharField(max_length=1, choices=STATUS_CHOICES, default=OPEN)
timestamp = models.DateTimeField(auto_now=True)
class Meta:
unique_together = (('exam', 'delegation', 'action'),)
私の問題は、(一瞬)私はExamAction.OPEN
のデフォルト値を引き受けるそのため、アクションはまだDBに記載されていることができなかったことを前提としているため、クエリが、今はかなり複雑で取得することです。
具体的な例では、これは私がまだ代表団のために開かれている試験の一覧を照会するために、現時点で使用するものです。
exams_open = Exam.objects.filter((Q(examaction__delegation=delegation) & Q(examaction__action=ExamAction.TRANSLATION) & Q(examaction__status=ExamAction.OPEN))
| Q(examaction__isnull=True), active=True,)
私は上記のクエリでも間違っていると信じて、それは必要があるのでExamAction
にaction=TRANSLATION
とdelegation=delegation
が含まれていない場合はExam
オブジェクトを返しますが、別のアクションが既に格納されていても(値は何でも)保存されません。
私はこの設計上の問題に遭遇した最初の人ではないと確信しています。もっと簡単な実装が存在しなければならないと思います。しかし何?
私は現在、検討していることである:
ExamAction.objects.get_or_create()
- 問題1:それはある:GETクエリが
- が問題2一意である必要があります。すなわち、これは、複数の一致では動作しません。 には役に立ちません。オブジェクトをGETリクエストで作成してください。
- 新しい
Exam
オブジェクトを作成すると、可能な限りExamAction
が生成されます。これは、すべての代表団を通じてループすることを意味する。- 試験が生成された後に委任が追加されるとどうなりますか?
- のManyToMany関係は、この状況で役立ちますか?私はまだ、希望の(デフォルト)値を持つExamActionかまだ存在していないExamActionをクエリする必要があるので、そうは思わない。
- 完全に再設計されていますか?私は可能なアイデアを公開しています!
ありがとうございます。
フィードバックありがとうございます。マネージャでのクエリは、実際にははるかにエレガントであり、私は最初から維持するのがとても醜いわけではありません。 –
私はビットポイント2を追求しようとしました。結局、大きな二次データベースを持つことになりました。私はちょうど始めにすべてのエントリを作成し、GETリクエストでの作成を避けるために、私はdelegationと試験。 –
提案したクエリに問題が見つかりました。私はどのように修正し、いくつかの詳細なデバッグを投稿しました。 –