Django: запрос базы данных для самой последней записи для каждого типа - PullRequest
0 голосов
/ 19 ноября 2018

Я собираю данные об устройствах с поддержкой WiFi и храню MAC-адрес, а также время сбора данных в базе данных.Каждое устройство обнаруживается несколько раз, что означает, что в таблице базы данных есть несколько строк с одинаковым MAC-адресом, но разным временем обнаружения, например:

DB Results

То, что я хочу, это получить только самое последнее обнаружение для каждого MAC-адреса.В приведенном выше примере это будет:

  • Nov.17, 2018, 6:17: 02: e3: e6: b4: 63: 81
  • ноябрь.17, 2018, 6:20: 0a: 13: 0b: 18: c0: 5e
  • Nov.17, 2018, 6:20: 16: 50: 1d: 82: cf: fa

Как я могу отфильтровать мой запрос к БД для достижения чего-то подобного?

models.py

from django.db import models

"""
    Node is a Pi Zero. Each time one of these is found, we want to display it
    as a map marker
"""
class Node(models.Model):

    # A human readable name for the node
    name = models.CharField(max_length=30, default='Pi Zero')
    mac_address = models.CharField(max_length=30, primary_key=True)
    time = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

"""
    Device is a WiFi enabled devices. The Pi Zeros
    discover new Devices and feed that information to the mesh network sink. The
    sink node then makes a POST request to this webapp that instantiates an instance
    of this model.

    This data is displayed on the map and is associated with each Node Model.
"""
class Device(models.Model):

    discovered_by = models.ForeignKey(Node, on_delete=models.CASCADE)
    mac_address = models.CharField(max_length=18)
    age = models.IntegerField(default=0)
    vendor = models.CharField(max_length=60, blank=True)
    time = models.DateTimeField(auto_now_add=True)

views.py:

from django.shortcuts import render
from django.views import generic
# from django.views.generic import edit
from apps.main.models import Node, Device
from django.conf import settings

class HomeView(generic.TemplateView):

    template_name = 'index.html'

    def nodes(self):
        nodes = Node.objects.all()
        for node in nodes:
            node.devices = Device.objects.filter(discovered_by=node).order_by('mac_address', '-time')
        return nodes

1 Ответ

0 голосов
/ 19 ноября 2018

Самое простое здесь решение, помимо вашего комментария .... Просто используйте groupby, и, поскольку оно уже отсортировано, просто отобразите первый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...