Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
事件列表上的Django查询:查找最近的事件_Django_Django Queryset - Fatal编程技术网

事件列表上的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.

我有一个收集事件的django模型。大致如下:

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的正确解决方案

  • 对于框B和用户U,用户最近是否打开或关闭了此框
  • 对于框B,有多少用户处于打开状态
  • 对于框B,我想逐日绘制打开的用户数,因此我想得到每天打开和关闭的用户分组数组
  • 我想要一张表格,上面有多少用户处于打开状态
  • 例如,在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
    
    还有,只是一个建议

  • 型号名称应为单数。事件
  • 如果只是将事件类型字段类型命名为event\u type,而不是event\u type,则更好。我们已经在事件模型中了。因此,我们不需要通过将模型名称标记为前缀来命名字段。但是,我不会给字段类型命名。我更喜欢分类或者别的。与事件时间戳相同。您可以显式地命名此字段,比如说将其保存或创建(基于您的用例)

  • 请把你的问题集中到一个问题上,相关的文档在这里。对不起,我以为这是一个问题。正如问题末尾所指出的,我认为解决一个人的技术解决了所有问题。(感谢子查询链接,我错过了(或者在之前的阅读中没有充分理解)。)用户可以多次更改状态:打开、关闭、打开。@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