从 Django 模型中过滤 json 数据

Posted

技术标签:

【中文标题】从 Django 模型中过滤 json 数据【英文标题】:filter json data from Django model 【发布时间】:2016-02-28 05:19:33 【问题描述】:

首先我创建一个管理员用户和两个模型

Tcu 类 用户 = 模型。外键(用户) imei = models.CharField(max_length=30, unique=True) 班级职位 tcu = 模型.ForeignKey(Tcu) 纬度 = models.CharField(max_length=30) 经度 = models.CharField(max_length=30) gps_date = models.CharField(max_length=20) speed = models.CharField(max_length=10, null=True, blank=True) 标题 = models.CharField(max_length=10, null=True, blank=True)

之后,我手动将我的管理员用户分配给两个 TCU。

第一个Tcu有三个位置数据:

"latitude": "21", "longitude": "21", "latitude": "22", "longitude": "22", "latitude": "23", "longitude": "23"

第二个Tcu有两个位置数据:

"latitude": "10", "longitude": "10", "latitude": "11", "longitude": "11"

之后我创建一个视图以获取两个 TCU 的最后位置。

def tcu_position(请求): current_user_id = request.user.id tcu_pos = Position.objects.filter(tcu_id__user_id=current_user_id).values('latitude', 'longitude').order_by('-id')[:1:1] 返回 JsonResponse ('json_position_list': list(tcu_pos))

结果我只得到了第二个TCU的最后一个位置:

"latitude": "11", "longitude": "11"

如何从第一个和第二个 TCU 获得最后位置?

【问题讨论】:

[:1:1] 是有意的吗?如果没有,那么您应该相应地更改它,因为它限制了您将获得的记录数。 我知道我正在获取 json 对象的最后一个位置.. 但我需要每个 Tcu 的最后一个位置 【参考方案1】:

如果我理解正确,您想要属于当前用户的每个 Tcu 的最后一个 Position 吗?如果是,则以下内容应该有效:

positions = [
  tcu.position_set.order_by('-id').values('latitude','longitude')[0]   
  for tcu in request.user.tcu_set.prefetch_related('position_set')
  ]

有人可能会证明我错了,但我认为没有一种简单方法可以在不迭代 Tcu 集的情况下获得你想要的东西......

编辑:如果您有Tcus 而没有position,您可能需要过滤掉它们(最好在Queryset 级别)以避免IndexError

tcus =  request.user.tcu_set.exclude(position_set__isnull=True).prefetch_related('position_set')
positions = [
  tcu.position_set.order_by('-id').values('latitude','longitude')[0]   
  for tcu in tcus
  ]

【讨论】:

对,我要属于当前用户的每个Tcu的最后一个位置! 嗨,Bruno,这是完美的,但是当 Tcu 存在而没有任何关联的位置时,我注意到我的系统中存在问题。按照上面的例子,如果我添加第三个没有位置的 Tcu,我会得到这个错误:列表索引超出范围。 如果您能帮助我,我将不胜感激 @picador 这很简单,你应该可以自己解决这个问题。您只需过滤掉request.user.tcu_set 中没有相关职位的Tcu。您可以在 ORM 级别进行过滤(参见 Django 的 ORM 文档了解更多信息),这应该是最有效的解决方案,也可以在 Python 级别使用列表理解的可选条件部分进行过滤(参见 Python 的列表理解文档了解更多信息)。 感谢您的帮助我已经检查了文档,并在列表理解中添加了一个条件部分。我尝试了一些没有退出的 if 语句(如果 tcu.position_set 不是 None)。正如你所说,我需要过滤掉没有相关职位的 tcu。在使用 Django 之前,我从来没有这样做过,所以我可能提出了一个完全愚蠢的问题。但是请你帮我处理一下 if 语句?

以上是关于从 Django 模型中过滤 json 数据的主要内容,如果未能解决你的问题,请参考以下文章

Jquery自动完成不过滤来自django的JSON数据

Django 从模型中过滤:Model.objects.filter(Q())

Django中模型

在 Django 中使用继承过滤模型

Django:过滤一个模型记录以显示其他模型的所有记录

Django:在过滤器和搜索中使用 JSONField 属性