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 回答