从 Django 模型过滤 json 数据

问题描述 投票:0回答:1

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

class Tcu:
    user = models.ForeignKey(User)
    imei = models.CharField(max_length=30, unique=True)

class Position:
    tcu = models.ForeignKey(Tcu)
    latitude = models.CharField(max_length=30)
    longitude = models.CharField(max_length=30)
    gps_date = models.CharField(max_length=20)
    speed = models.CharField(max_length=10, null=True, blank=True)
    heading = 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(request):
    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]
    return JsonResponse ({'json_position_list': list(tcu_pos)})

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

{"latitude": "11", "longitude": "11"}

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

python json django
1个回答
5
投票

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

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

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

编辑:如果您有

Tcu
而没有
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
  ]
© www.soinside.com 2019 - 2024. All rights reserved.