7

m2m フィールドに基づいて order_by を実行しようとしていますが、クエリセットに重複したエントリが作成されてしまいます。私はdjangoのドキュメントとスタック交換に関する関連する質問を検索してきましたが、解決策を思いつくことができませんでした.

モデル:

class WorkOrder(models.Model):
    ...
    appointment = models.ManyToManyField(Appointment, null=True, blank=True, related_name = 'appointment_from_schedule')
    ...

class Appointment(models.Model):

    title = models.CharField(max_length=1000, blank=True)
    allDay = models.BooleanField(default=False)
    start = models.DateTimeField()
    end = models.DateTimeField(null=True, blank=True)
    url = models.URLField(blank=True, null=True)

クエリ:

qs = WorkOrder.objects.filter(work_order_status="complete").order_by("-appointment__start")

結果:

[<WorkOrder: 45: Davis>, <WorkOrder: 45: Davis>]

対話モード:

>>>qs[0] == a[1]
True
>>>qs[0].pk
45
>>>qs[1].pk
45

order_by を削除すると結果は 1 つしか得られませんが、後で追加すると重複したエントリが元に戻ります。

>>>qs = WorkOrder.objects.filter(work_order_status="complete")
>>>qs
[<WorkOrder: 45: Davis>]
>>>qs.order_by('appointment__start')
[<WorkOrder: 45: Davis>, <WorkOrder: 45: Davis>]

私は .distinct() と .distinct('pk') を追加しようとしましたが、前者は効果がなく、後者はエラーになります:

ProgrammingError: SELECT DISTINCT ON expressions must match initial ORDER BY expressions
4

2 に答える 2

4

annotate の使用について sfletche から提供された提案を受け、freenode.net irc チャンネル #django で問題について議論しました。

ユーザー FunkyBob と jtiai は、私がそれを機能させるのを手伝ってくれました。

各作業指示書には多くの予定がある可能性があるため、予定で注文するように依頼すると、どの予定で注文するつもりだったのかわからないため、予定のすべてのインスタンスの行が返されます。

from django.db.models import Max

WorkOrder.objects.annotate(max_date=Max('appointment__start')).filter(work_order_status="complete").order_by('max_date')

つまり、構文を正しくするだけで、正しい道を進んでいました。

sfletche、FunkyBob、jtiai を助けてくれてありがとう。

于 2014-05-12T03:36:17.693 に答える
1

annotateで使用してみてくださいvalues

qs = WorkOrder.objects.filter(work_order_status="complete").values("appointment").annotate(status="work_order_status").order_by("-appointment__start")
于 2014-05-12T02:49:11.680 に答える