Объединить 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 среды обитания)
Итак, как я могу создать новый столбец с конкатенацией морской зоны и среды обитания, чтобы иметь возможность объединить мои две таблицы?
или есть какое-либо другое решение для объединения моих двух таблиц?
Спасибо!
Не совсем понимаю, что вы имеете в виду, когда говорите, что он импортирован, поэтому это может быть не то, что вы ищете:
Моим решением было бы превратить 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
.
Если у вас нет такого контроля над данными, то лучше использовать необработанный запрос.