1

複数のテーブルからデータを取得する必要があり、動的に構築されたフィルターを使用して、テーブルのデータを使用する場合と使用しない場合があります。

だから私はこれを持っていると言います:

class Solution(models.Model):
    name = models.CharField(max_length=MAX, unique=True)
    # Other data

class ExportTrackingRecord(models.Model):
    tracked_id = models.IntegerField()
    solution = models.ForeignKey(Solution)
    # Other data

次に、他の場所で行う必要があります。

 def get_data(user_provided_criteria):
      etr = ExportTrackingRecord.objects.filter(make_Q_object(user_provided_criteria)).select_related()

      for data in etr: 
          s = data.solution
          # do things with data from both tables

私の知る限り、Solution のフィールドでフィルターをかけると、django が結合を行い、select_related両方のオブジェクトを取得します。フィールドのみをフィルタリングExportTrackingRecordすると、結合は行われず、django はExportTrackingRecordQuerySet 内のそれぞれに対して新しいクエリを生成します (数千になる可能性があります...)

私はdjangoにかなり慣れていませんが、参加を強制する合理的な方法はありますか?

4

2 に答える 2

1

select_related()あなたの問題の鍵です。それを使用せず、関連モデルのフィールドでフィルタリングしない場合、関連モデルのデータにアクセスしている場合、Django は結合を行わず、結果のすべての行に対して余分なクエリを発生させます。

あなたのようなExportTrackingRecord.objects.filter(...).select_related('solution')ことをすると、Django は常にSolutionテーブルとの結合を強制されます。

逆の外部キー関係を介して、他の方向で同じことを行う必要がある場合は、prefetch_related()多対多の関係についても同じことが必要です

于 2013-05-21T20:09:35.067 に答える