Объединить 2 таблицы по 2 столбцам в django

У меня есть база данных, импортированная из mysql в models.py следующим образом:

class Sig(models.Model):
id = models.IntegerField(db_column='Id', primary_key=True)
proportion = models.FloatField(db_column='Prop', blank=True, null=True)
marine_area = models.CharField(db_column='Marine_Area', max_length=255, blank=True, null=True)
habitat = models.CharField(db_column='Habitat', max_length=255, blank=True, null=True)

У этого нет никаких координат. Координаты находятся в другой таблице :

class Coord(models.Model):
id = models.IntegerField(db_column='Id', primary_key=True)
marine_area = models.CharField(db_column='Marine_Area', max_length=255, blank=True, null=True)
habitat = models.CharField(db_column='Habitat', max_length=255, blank=True, null=True)
latitude = models.FloatField(db_column='Latitude', blank=True, null=True)
longitude = models.FloatField(db_column='Longitude', blank=True, null=True)

Я хочу визуализировать мои пропорции в соответствии с их координатами (широта и долгота). Однако, каждая локализация определяется морской областью и средой обитания (каждая морская область имеет 3 среды обитания)

for ex

Итак, как я могу создать новый столбец с конкатенацией морской зоны и среды обитания, чтобы иметь возможность объединить мои две таблицы?

или есть какое-либо другое решение для объединения моих двух таблиц?

Спасибо!

Не совсем понимаю, что вы имеете в виду, когда говорите, что он импортирован, поэтому это может быть не то, что вы ищете:

Моим решением было бы превратить marine_area и habitat в собственные модели (или вы можете сделать их одной моделью, если это лучше подходит для вашего случая использования) и использовать отношение ForeignKey ship из двух предоставленных вами моделей. Например, у вас могут быть следующие модели:

class Habitat(models.Model):
    name = models.CharField(max_length=255, blank=True, null=True)
    # ... other data

class MarineArea(models.Model):
    name = models.CharField(max_length=255, blank=True, null=True)
    habitats = models.ManyToManyField(Habitat, related_name="marine_areas")
    # ... other data

class Sig(models.Model):
    proportion = models.FloatField(db_column='Prop', blank=True, null=True)
    marine_area = models.ForeignKeyField(MarineArea, related_name="sigs")
    habitat = models.ForeignKeyField(Habitat, related_name="sigs")

class Coord(models.Model):
    marine_area = models.ForeignKeyField(MarineArea, relate_name="coords")
    habitat = models.ForeignKeyField(Habitat, related_name="coords")
    latitude = models.FloatField(db_column='Latitude', blank=True, null=True)
    longitude = models.FloatField(db_column='Longitude', blank=True, null=True)

Это позволяет вам сказать marine_area.habitats.all() и получить список всех мест обитания для данной морской зоны, или habitat.marine_areas.all() получить список всех морских зон с данным типом среды обитания. Затем вы используете внешние ключи для связи Sig и Coord обратно с моделью Habitat и MarineArea.

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

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