关于python:从Django模型中过滤json数据

filter json data from Django model

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

1
2
3
4
5
6
7
8
9
10
11
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有三个位置数据:

1
{"latitude":"21","longitude":"21"}, {"latitude":"22","longitude":"22"}, {"latitude":"23","longitude":"23"}

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

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

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

1
2
3
4
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的最后一个位置:

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

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


如果我理解正确,您想要每个TCU属于当前用户的最后一个位置吗?如果是,则应执行以下操作:

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

有人可能会证明我错了,但我认为没有一个简单的方法可以在不迭代TCU集的情况下得到您想要的东西…

编辑:如果您有没有positionTcus,您可能希望将它们过滤掉(最好是在Queryset级),以避免IndexError

1
2
3
4
5
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
  ]