django - Django ORM。如何排除旧数据?
问题描述
我想从我的查询集中排除多余的旧记录。
我尝试使用 annotate(Max('pc_users__created')),但这不是我想要的。我想我应该使用'group by'或类似的东西,但我不明白如何。
这是我的models.py
class Room(models.Model):
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
room_number = models.SmallIntegerField()
def __str__(self):
return f'Room №{self.room_number}'
class UserProfiles(models.Model):
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
name = models.CharField(max_length=100)
def __str__(self):
return f'{self.name}'
class Pc(models.Model):
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
title = models.CharField(max_length=100)
ram = models.SmallIntegerField()
cpu = models.CharField(max_length=20)
gpu = models.CharField(max_length=20)
def __str__(self):
return f'{self.title}'
class PcUsers(models.Model):
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
pc = models.ForeignKey(Pc, on_delete=models.PROTECT, related_name='pc_users')
user = models.ForeignKey(UserProfiles, on_delete=models.PROTECT)
def __str__(self):
return f'{self.pc}: {self.user}'
class PcRooms(models.Model):
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
pc = models.ForeignKey(Pc, on_delete=models.PROTECT, related_name='pc_rooms')
room = models.ForeignKey(Room, on_delete=models.PROTECT)
def __str__(self):
return f'{self.pc}: {self.room}'
和views.py:从 myapp.models 导入 PC
def report(request):
data = Pc.objects.values(
'id',
'title',
'pc_users__user__name',
'pc_rooms__room__room_number'
)
return render(request, 'report.html', {'data': data})
这也是我来自管理站点的数据
我想排除所有重复记录并保留所有最新记录。 像这样
+-------+------------+---------+---------+
| ID Pc | Pc Title | Pc User | Pc Room |
+-------+------------+---------+---------+
| 1 | Laptop | User1 | 201 |--> Keep this
| 1 | Laptop | User1 | 999 |
| 1 | Laptop | Admin | 201 |
| 1 | Laptop | Admin | 999 |
| 2 | PC1 | User1 | 201 |--> Keep this
| 2 | PC1 | User1 | 202 |
| 2 | PC1 | User2 | 201 |
| 2 | PC1 | User2 | 202 |
| 3 | PC2 | User2 | 202 |--> Keep this
| 3 | PC2 | User2 | 203 |
| 3 | PC2 | User3 | 202 |
| 3 | PC2 | User3 | 203 |
| 4 | PC3 | User3 | 203 |--> Keep this
| 4 | PC3 | User3 | 201 |
| 4 | PC3 | User1 | 203 |
| 4 | PC3 | User1 | 201 |
| 5 | Server | Admin | 999 |--> Keep this
| 6 | new laptop | None | 301 |--> Keep this
+-------+------------+---------+---------+
解决方案
用于distinct()
排除重复并order_by
使用该created
字段保留最新记录
推荐阅读
- java - 为什么我得到 The operator - is undefined for the argument type(s) java.math.BigDecimal, java.math 错误消息
- c# - 多种解决方案应用
- python - 使用 Pandas 读取 Excel 数据并保留单元格值的换行符
- botframework - 无法在指向用户和机器人消息的每个消息的文本框中获取语音箭头
- java - 如何在里面制作带有 Spring Bean 的 jar,并在 SpringBoot 应用程序中使用它?
- python - 类型错误:forward() 缺少 1 个必需的位置参数:“隐藏”
- javascript - 使用带有 post_filter 的 query_string 搜索
- buildroot - 如何创建 buildroot 外部主机包
- c++ - 如何计算轮廓内像素的黑白比
- c# - 在 Azure 应用服务中托管时,如何控制添加到我的 ASP.NET 核心 Web 应用程序的 HTTP 响应标头?