0

私は2つのテーブルが言います

class A(models.Model):
    A_version = models.DecimalField(max_digits=4, decimal_places=0)
    A_name = models.CharField(max_length=32, blank=True)
    A_type    = models.CharField(max_length=32, blank=True)
    unique_together(A_version,A_name)

class B(models.Model):
    B_version = models.ForeignKey(A)
    B_name    = models.ForeignKey(A)
    last_reported_time= models.DecimalField(max_digits=4, decimal_places=0)
    unique_together(B_version,B_name)

obj = B.objects.filter(B_name__A_type="Vendor").
        values('B_name','B_version').annotate(Max('last_reported_time')).
        order_by('B_name','B.B_version')

last_reportedユニークではありません。

今私は2つの問題があります。

  1. distinct代わりに使用するannotateと、明確な値を取得できませんでした。だから私はannotate何人かの人々によって提案されたように使用しました。それでも私は明確でない値を取得します。どうすれば明確な値を取得できますか?

  2. 上記のクエリの生のSQLクエリを表示すると、に変換されorder_by(B.B_name and A.B_version)ます。どうすれば入手できorder_by(B.B_version)ますか?

4

1 に答える 1

0

以前の質問への回答で述べたように、これは優れたモデル設計ではありません。A_NameとA_VersionはクラスAで一緒に一意であるため、クラスBの外部キーを作成してクラスAのIDを参照する必要があります。そうすると、すべてのクエリがはるかに簡単になり、すべてを投稿する必要がなくなります。ここに質問があります。

さあ、最後にもう一度。クラスBのNameおよびVersion外部キーを削除します。

class A(models.Model):
    A_version = models.DecimalField(max_digits=4, decimal_places=0)
    A_name = models.CharField(max_length=32, blank=True)
    A_type    = models.CharField(max_length=32, blank=True)

    class Meta:
        unique_together(A_version,A_name)

class B(models.Model):
    a = models.ForeignKey(A) #Reference the A.id
    last_reported_time= models.DecimalField(max_digits=4, decimal_places=0)

obj = A.objects.filter(A_type="Vendor").annotate(last_time=Max('B__last_reported_time')).
    order_by('A_name','A_version')

更新:モデルは変更できないため、次のことを試してください。

class A(models.Model):
    A_version = models.DecimalField(max_digits=4, decimal_places=0)
    A_name = models.CharField(max_length=32, blank=True)
    A_type    = models.CharField(max_length=32, blank=True)

    unique_together(A_version,A_name)

class B(models.Model):
    B_version = models.ForeignKey(A, to_field='A_version') #Note the to_field
    B_name    = models.ForeignKey(A, to_field='A_name')   #Note the to_field     
    last_reported_time= models.DecimalField(max_digits=4, decimal_places=0)

    unique_together(B_version,B_name)

obj = A.objects.filter(A_type="Vendor").
    values('A_name','A_version').annotate(last_time=Max('B__last_reported_time')).
    order_by('A_name','A_version')
于 2012-10-19T08:24:11.377 に答える