姜戈 ORM。如何排除旧数据?
Django ORM. How to exclude old data?
我想从我的查询集中排除不必要的旧记录。
我尝试使用 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})
还有我的 data 来自管理站点
我想排除所有重复记录并保留所有最新记录。
Like this
+-------+------------+---------+---------+
| 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
字段保留最新记录
我想从我的查询集中排除不必要的旧记录。
我尝试使用 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})
还有我的 data 来自管理站点
我想排除所有重复记录并保留所有最新记录。 Like this
+-------+------------+---------+---------+
| 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
字段保留最新记录