Фильтрация одной модели с помощью столбца 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
столбцы также совпадают.
Сейчас я могу решить проблему следующим образом:
- фильтрование первой модели
Vor
наvdat
- Используя выход 1. Я ввожу значения
id_vv
вVorDet.objects.filter(id_det__in=...)
- затем объединяю оба вывода через 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')
Это работает, но это громоздко и, как я вижу, совсем не то, как это должно быть сделано.
Я хотел бы понять это правильно и буду рад любой подсказке/помощи.
Этот вопрос звучит очень похоже на мою проблему, и есть довольно много других, которые, кажется, должны работать, но я не могу заставить их работать.