Объединить 2 модели (таблицы) в Django и показать в моем шаблоне - PullRequest
0 голосов
/ 24 марта 2020

У меня есть 2 модели: одна определяет все устройства, которые у меня есть, а другая хранит информацию, которую получают эти устройства. Их код следующий:

class Device(models.Model):
    dev_eui = models.CharField(max_length=16, primary_key=True)
    producer = models.CharField(max_length=20, blank=True, null=True)
    model = models.CharField(max_length=20, blank=True, null=True)
    firmware = models.CharField(max_length=10, blank=True, null=True)
    dev_name = models.CharField(max_length=20, blank=True, null=True)
    description = models.CharField(max_length=40, blank=True, null=True)
    fixed = models.BooleanField()
    dev_lat = models.FloatField(null=True, blank=True)
    dev_lon = models.FloatField(null=True, blank=True)
    deco_name = models.CharField(max_length=20)
    fleet_id = models.IntegerField(null=True, blank=True)

class DevData(models.Model):
    data_uuid = models.UUIDField(primary_key=True, default=uuid.uuid1, editable=False)
    data_id = models.IntegerField()
    dev_eui = models.CharField(max_length=16)
    gateway = models.CharField(max_length=25)
    data_timestamp = models.DateTimeField()
    rssi = models.IntegerField()
    snr = models.IntegerField()
    datarate = models.CharField(max_length=15)
    frequency = models.IntegerField()
    seq = models.IntegerField()
    data_1 = models.FloatField()
    data_2 = models.FloatField(null=True, blank=True)
    data_3 = models.FloatField(null=True, blank=True)
    data_4 = models.FloatField(null=True, blank=True)
    data_5 = models.FloatField(null=True, blank=True)
    data_6 = models.FloatField(null=True, blank=True)
    data_7 = models.FloatField(null=True, blank=True)

На самом деле я хочу показать таблицу в моем шаблоне, объединяя все данные из devData и добавляя dev_name и fleet_id из * 1007. *.

Теперь я получаю все данные и фильтрую их в шаблоне. Но я уверен, что в views.py лучше и проще делать это, но я не знаю как.

Читая некоторую информацию, я нашел функцию union(), но она не работает, и я не уверен, что это лучший вариант,

@login_required(login_url='/user_app/login/')
def user_data(request):
    dev_data = DevData.objects.all()
    devices = Device.objects.all()

    test = DevData.objects.all().values_list(
        "dev_eui"
    ).union(
    Device.objects.all().values_list(
        "dev_eui"
    ))

    ctx = {'DevData':dev_data,'Devices':devices, 'Test':test}
    return render(request, template_name='data.html', context=ctx)

Это объединение ничего не показывает.

Кто-нибудь может мне помочь? Большое спасибо!

1 Ответ

1 голос
/ 24 марта 2020

Вам нужен внешний ключ, относящийся к двум моделям.

class Device(models.Model):
    dev_eui = models.CharField(max_length=16, primary_key=True)

class DevData(models.Model):
    device = models.ForeignKeyField(Device, related_name='dev_data', on_delete=models.CASCADE)
    data_uuid = models.UUIDField(primary_key=True, default=uuid.uuid1, editable=False)
    data_id = models.IntegerField()
    # This is not needed, it can be accessed via instance.device.dev_eui now
    # dev_eui = models.CharField(max_length=16)

Затем, чтобы получить все экземпляры DevData для конкретного устройства:

for device in Device.objects.all():
    x = device.dev_data.all()

Пожалуйста, прочитайте документация для лучшего понимания полей отношений.

...