Фильтрация одной модели с помощью столбца id другой модели в Django

Я хочу отобразить таблицу в HTML, которая содержит столбцы из двух разных таблиц/моделей.

Модели выглядят примерно так:

class Vor(models.Model):
    id_vv = models.BigIntegerField(db_column='ID_VV', blank=True, null=False, primary_key=True)
    vdat = models.DateField(db_column='VDat', blank=True, null=True)
    v_li = models.TextField(db_column='V_Li', blank=True, null=True)    
    ... # more columns/objects exist

и

class VorDet(models.Model):
    id_det = models.BigIntegerField(db_column='ID_Det', blank=True, null=False, primary_key=True)
    v_li = models.TextField(db_column='V_Li', blank=True, null=True)    
    v_twg = models.TextField(db_column='v_twg', blank=True, null=True)    
    ... # more columns/objects exist
    vor = models.ForeignKey(Vor, on_delete=models.CASCADE, blank=True, null=True) #empty as it  was not part of the legacy data table

Данные в БД были импортированы из файлов csv (унаследованная база данных из access) с помощью ./ manage.py migrate --fake -initial. Поэтому models.ForeignKey() пуст - я не совсем уверен, имеет ли это значение или нет.

Мне нужно отобразить vdat, v_li и v_twg в одном списке. id_vv имеет one-to-many связь с id_det и становится unique только в том случае, если v_li столбцы также совпадают.

Сейчас я могу решить проблему следующим образом:

  1. фильтрование первой модели Vor на vdat
  2. Используя выход 1. Я ввожу значения id_vv в VorDet.objects.filter(id_det__in=...)
  3. затем объединяю оба вывода через pd.merge()

vor_list = Vor.objects.filter(vdat__startswith="2022").values() 
det_list = VorDet.objects.filter(id_det__in=[x['id_vv'] for x in vor_list]).values()

comb_list = pd.merge(pd.DataFrame(vor_list), 
                     pd.DataFrame(det_list), 
                     left_on  = ['id_vv',  'v_li'], 
                     right_on = ['id_det', 'v_li'])

comb_list=comb_list.to_dict('records')

Это работает, но это громоздко и, как я вижу, совсем не то, как это должно быть сделано.

Я хотел бы понять это правильно и буду рад любой подсказке/помощи.

Этот вопрос звучит очень похоже на мою проблему, и есть довольно много других, которые, кажется, должны работать, но я не могу заставить их работать.

Вернуться на верх