事件列表上的Django查询:查找最近的事件
我有一个收集事件的django模型。大致如下:事件列表上的Django查询:查找最近的事件,django,django-queryset,Django,Django Queryset,我有一个收集事件的django模型。大致如下: class Events(models.Model): class EventType(models.TextChoices): OPEN = ... CLOSE = ... OTHER = ... READ = ... user = models.ForeignKey(User, on_delete=models.CASCADE) box = models.
class Events(models.Model):
class EventType(models.TextChoices):
OPEN = ...
CLOSE = ...
OTHER = ...
READ = ...
user = models.ForeignKey(User, on_delete=models.CASCADE)
box = models.ForeignKey(Box, on_delete=models.CASCADE)
event_timestamp = models.DateTimeField(default=django.utils.timezone.now)
event_type = models.CharField(max_length=6, choices=EventType.choices)
当用户使用方框进行操作时会发生事件
我有四个非常相关的查询,我想做,我根本不知道如何在不使用SQL的情况下做到这一点,而SQL通常不是django的正确解决方案
非常感谢您的指点。@jma-我假设-对于框B,有多少事件处于打开状态?您提到的用户处于开放状态?但是状态/事件类型(打开、关闭)与事件模型相关联
box = Box.objects.get(name='B') --- assuming you have a name field in Box entity
events = Events.objects.filter(box=box,event_type='open') #queryset
for event in events:
#your logic here
print(event)
3.对于方框B和用户U,此方框最近的事件是打开的还是关闭的?
假设一个用户U的方框B可以有多个事件
box = Box.objects.get(name='B') --- assuming you have a name field in Box entity
user = User.objects.get(username='U') -- you can filter based on any field.
此外,这取决于您希望在何处实现此功能。如果您使用的是Django视图,那么就不需要在数据库中查询用户对象。因为请求对象具有user属性
In django view, user = request.user
events = Events.objects.filter(box=box,user=user)
for event in events:
status = event.event_type
if status=='Open':
#do something
elif status=='Closed':
#do something
else:
#logic here
还有,只是一个建议
请把你的问题集中到一个问题上,相关的文档在这里。对不起,我以为这是一个问题。正如问题末尾所指出的,我认为解决一个人的技术解决了所有问题。(感谢子查询链接,我错过了(或者在之前的阅读中没有充分理解)。)用户可以多次更改状态:打开、关闭、打开。@jma-模型定义中的状态与事件相关。不是用户每个事件都与(用户、框)(在特定时间)有关。用户U1打开框B1不同于U1打开框B2或U2打开框B1。如果有100个框,我可能希望避免100个服务器往返以呈现框计数表。
In django view, user = request.user
events = Events.objects.filter(box=box,user=user)
for event in events:
status = event.event_type
if status=='Open':
#do something
elif status=='Closed':
#do something
else:
#logic here