简体   繁体   English

Django ORM。 如何排除旧数据?

[英]Django ORM. How to exclude old data?

I want to exclude unnessery old records from my queryset. 我想从我的查询集中排除不必要的旧记录。

I tried use annotate(Max('pc_users__created')), but this is not what i want. 我尝试使用annotate(Max('pc_users__created')),但这不是我想要的。 I think i should use 'group by' or something like that, but I can not understand how. 我认为我应该使用“分组依据”或类似的方式,但我不知道如何使用。

Here's my models.py 这是我的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}'

and views.py : from myapp.models import Pc 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})

Also here is my data from admin site 这也是我来自管理站点的数据

I want exclude all repetitive records and keep all newest records. 我要排除所有重复记录,并保留所有最新记录。 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领域,以保持最近的记录

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM