如何加入查询集
how to join in queryset
我对 Django 中的 QuerySet 有一些问题 python。
我有 2 tables/models.
class PP(models.Model):
imei = models.BigIntegerField(primary_key=True)
name = models.CharField(max_length = 50)
val2 = models.IntegerField(default = 0)
def __str__(self):
return self.name
class Mea(models.Model):
imei = models.ForeignKey(PP, on_delete=models.CASCADE)
v1 = models.IntegerField(default = 0)
v2 = models.IntegerField(default = 0)
v3 = models.IntegerField(default = 0)
dates = models.DateField(default=datetime.date.today)
def __str__(self):
return self.imei
PP
+----+--------+------+
|imei| name | val2 |
+----+--------+------+
| 1 | john | 12 |
| 2 | adam | 5 |
| 3 | alfred | 3 |
+----+--------+------+
Mea
+----+----+----+-----+---------------------+
|imei| v1 | v2 | v3 | date |
+----+----+----+-----+---------------------+
| 1 | 4 | 15 | 18 | 2020-10-16 11:15:53 |
| 1 | 2 | 12 | 17 | 2020-10-16 11:22:53 |
| 1 | 3 | 13 | 16 | 2020-10-16 11:32:53 |
| 2 | 1 | 16 | 15 | 2020-10-16 13:22:53 |
| 2 | 3 | 13 | 25 | 2020-10-16 13:42:53 |
| 2 | 4 | 12 | 35 | 2020-10-16 14:12:53 |
| 3 | 1 | 21 | 12 | 2020-10-16 14:12:53 |
| 3 | 2 | 28 | 42 | 2020-10-16 15:12:53 |
| 3 | 4 | 30 | 72 | 2020-10-16 16:12:53 |
+----+----+----+-----+---------------------+
我需要输入一个 table ID, NAME, v1,v2,v3,date 作为第一个 table 所有对象的新日期
像这样:
RESULT
+----+--------+----+----+-----+---------------------+
|imei| name | v1 | v2 | v3 | date |
+----+--------+----+----+-----+---------------------+
| 1 | john | 3 | 13 | 16 | 2020-10-16 11:32:53 |
| 2 | adam | 4 | 12 | 35 | 2020-10-16 14:12:53 |
| 3 | alfred | 4 | 30 | 72 | 2020-10-16 16:12:53 |
+----+--------+----+----+-----+---------------------+
我需要第二个 TABLE 的最新记录,供第一个 table 的所有人使用。
是否可以通过查询集来完成?
像这样向您的 PP 模型添加一个新的 属性:
class PP(models.Model):
imei = models.BigIntegerField(primary_key=True)
name = models.CharField(max_length = 50)
val2 = models.IntegerField(default = 0)
@property
def last_mea(self):
return self.mea_set.order_by('date','id').last()
def __str__(self):
return self.name
class Mea(models.Model):
imei = models.ForeignKey(PP, on_delete=models.CASCADE)
v1 = models.IntegerField(default = 0)
v2 = models.IntegerField(default = 0)
v3 = models.IntegerField(default = 0)
dates = models.DateField(default=datetime.date.today)
def __str__(self):
return self.imei
有了这个新的 属性,您可以访问 last_mea 做:
pp.last_mea
因此,在您的模板中,假设一个 PP 对象的查询集:
{% for q in queryset %}
<tr>
<td>{{q.imei}}</td>
<td>{{q.name}}</td>
<td>{{q.last_mea.v1}}</td>
<td>{{q.last_mea.v2}}</td>
<td>{{q.last_mea.v3}}</td>
<td>{{q.last_mea.dates | date:'Y-m-d'}}</td>
</tr>
{% endfor %}
编辑:
您不能使用以下格式显示时间:“2020-10-16 11:15:53”,因为您只存储没有时间的日期。 “日期”字段类型是“DateField”而不是“DateTimeField”。如果您需要时间,请将 DateField 更改为 DateTimeField 和默认值(今天 --> 现在)。
如果所有 PP
都有一个或多个相关 mea
(即没有空值),那么我认为您可以过滤 mea table 以排除重复项,这样您就不会错过没有一个或多个相关 Mea 行的任何 PP 行。
qs = Mea.objects.order_by('-dates' # descending, so newest first
).distinct( 'imei' # first row only for each imei
).order_by( 'imei' # re-order if required.
).select_related('imei' # for efficiency
)
for mea_instance in qs:
...
来自 pp 的数据通过 mea_instance.imei.name
等访问。.select_related('imei')
应该缓存另一个对象,这样您就不会再进行 N 次数据库查询。
我对 Django 中的 QuerySet 有一些问题 python。 我有 2 tables/models.
class PP(models.Model):
imei = models.BigIntegerField(primary_key=True)
name = models.CharField(max_length = 50)
val2 = models.IntegerField(default = 0)
def __str__(self):
return self.name
class Mea(models.Model):
imei = models.ForeignKey(PP, on_delete=models.CASCADE)
v1 = models.IntegerField(default = 0)
v2 = models.IntegerField(default = 0)
v3 = models.IntegerField(default = 0)
dates = models.DateField(default=datetime.date.today)
def __str__(self):
return self.imei
PP
+----+--------+------+
|imei| name | val2 |
+----+--------+------+
| 1 | john | 12 |
| 2 | adam | 5 |
| 3 | alfred | 3 |
+----+--------+------+
Mea
+----+----+----+-----+---------------------+
|imei| v1 | v2 | v3 | date |
+----+----+----+-----+---------------------+
| 1 | 4 | 15 | 18 | 2020-10-16 11:15:53 |
| 1 | 2 | 12 | 17 | 2020-10-16 11:22:53 |
| 1 | 3 | 13 | 16 | 2020-10-16 11:32:53 |
| 2 | 1 | 16 | 15 | 2020-10-16 13:22:53 |
| 2 | 3 | 13 | 25 | 2020-10-16 13:42:53 |
| 2 | 4 | 12 | 35 | 2020-10-16 14:12:53 |
| 3 | 1 | 21 | 12 | 2020-10-16 14:12:53 |
| 3 | 2 | 28 | 42 | 2020-10-16 15:12:53 |
| 3 | 4 | 30 | 72 | 2020-10-16 16:12:53 |
+----+----+----+-----+---------------------+
我需要输入一个 table ID, NAME, v1,v2,v3,date 作为第一个 table 所有对象的新日期 像这样:
RESULT
+----+--------+----+----+-----+---------------------+
|imei| name | v1 | v2 | v3 | date |
+----+--------+----+----+-----+---------------------+
| 1 | john | 3 | 13 | 16 | 2020-10-16 11:32:53 |
| 2 | adam | 4 | 12 | 35 | 2020-10-16 14:12:53 |
| 3 | alfred | 4 | 30 | 72 | 2020-10-16 16:12:53 |
+----+--------+----+----+-----+---------------------+
我需要第二个 TABLE 的最新记录,供第一个 table 的所有人使用。
是否可以通过查询集来完成?
像这样向您的 PP 模型添加一个新的 属性:
class PP(models.Model):
imei = models.BigIntegerField(primary_key=True)
name = models.CharField(max_length = 50)
val2 = models.IntegerField(default = 0)
@property
def last_mea(self):
return self.mea_set.order_by('date','id').last()
def __str__(self):
return self.name
class Mea(models.Model):
imei = models.ForeignKey(PP, on_delete=models.CASCADE)
v1 = models.IntegerField(default = 0)
v2 = models.IntegerField(default = 0)
v3 = models.IntegerField(default = 0)
dates = models.DateField(default=datetime.date.today)
def __str__(self):
return self.imei
有了这个新的 属性,您可以访问 last_mea 做:
pp.last_mea
因此,在您的模板中,假设一个 PP 对象的查询集:
{% for q in queryset %}
<tr>
<td>{{q.imei}}</td>
<td>{{q.name}}</td>
<td>{{q.last_mea.v1}}</td>
<td>{{q.last_mea.v2}}</td>
<td>{{q.last_mea.v3}}</td>
<td>{{q.last_mea.dates | date:'Y-m-d'}}</td>
</tr>
{% endfor %}
编辑:
您不能使用以下格式显示时间:“2020-10-16 11:15:53”,因为您只存储没有时间的日期。 “日期”字段类型是“DateField”而不是“DateTimeField”。如果您需要时间,请将 DateField 更改为 DateTimeField 和默认值(今天 --> 现在)。
如果所有 PP
都有一个或多个相关 mea
(即没有空值),那么我认为您可以过滤 mea table 以排除重复项,这样您就不会错过没有一个或多个相关 Mea 行的任何 PP 行。
qs = Mea.objects.order_by('-dates' # descending, so newest first
).distinct( 'imei' # first row only for each imei
).order_by( 'imei' # re-order if required.
).select_related('imei' # for efficiency
)
for mea_instance in qs:
...
来自 pp 的数据通过 mea_instance.imei.name
等访问。.select_related('imei')
应该缓存另一个对象,这样您就不会再进行 N 次数据库查询。