pythonjsondjango

filter json data from Django model


I have created an admin user and two models

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)

After that I manually assign my admin user to two TCUs.

The first TCU has three position data:

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

The second TCU has two position data:

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

After that I create a view in order to get the last position of both TCUs.

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)})

The result is that I only get the last position of the second TCU:

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

How can I get both last position from first and second TCU ?


Solution

  • If I understand correctly, you want the last Position for each Tcu belonging to the current user ? If yes the following should work:

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

    Someone might prove me wrong but I don't think there's a simple way to get what you want without iterating on the Tcu set...

    Edit: if you have Tcus without position, you may want to filter them out (preferably at the Queryset level) to avoid 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
      ]