Как получить 2 разных класса в одном поле модели в django?
Я работаю в проекте, где мне нужно объединить/объединить различные классы в одно поле.
Я хочу сделать это таким образом, потому что у меня есть два разных класса ParkingArea1
и ParkingArea2
, и я хочу иметь возможность выбора из Admin и WebInterface, чтобы выбрать любую из этих двух областей из одного выпадающего списка, и в идеале хранить их в поле другой модели.
Вот мои модели:
class ParkingArea1(models.Model):
zone_name = models.Charfield(max_length=255, unique=True)
# some more unique fields below
def __str__(self): return self.zone_name
class ParkingArea2(models.Model):
area_name = models.CharField(max_length=200, db_index=True, null=True, unique=True)
# some more unique fields below
def __str__(self): return self.area_name
class ChooseYourArea(models.Model):
area = # here I want a field, which should be able to hold any of the above classes
# some other stuff
Как я должен изменить свои модели, чтобы достичь этого?
ПРИМЕЧАНИЕ: ParkingArea1
и ParkingArea2
- две активно используемые таблицы, заполненные данными, поэтому изменение в рамках этих моделей не будет оптимальным.
Я немного поискал, но не смог найти ничего подходящего для моего случая. Я понимаю, что для этого случая можно использовать абстрактный базовый класс, но такой базовый класс не позволит мне перечислить все области, которые я хочу. Есть ли очевидный подход, который я упустил?
Вы не можете, если хотите использовать ForeignKeys. И ParkingArea1
, и ParkingArea2
имеют свои собственные первичные ключи. Django не будет знать, к какой таблице принадлежит этот внешний ключ. Вам нужно 2 поля.
Есть способы обойти это, но вам нужно обеспечить согласованность данных на уровне Django, и производительность будет ужасной.
В итоге я создал еще один класс ParkingAreas
с двумя полями, где каждое поле может содержать либо ParkingArea1
, либо ParkingArea2
:
class ParkingAreas(models.Model):
area1 = models.OneToOneField(ParkingArea1, on_delete=models.SET_NULL, blank=True, null=True, default=None)
area2 = models.OneToOneField(ParkingArea2, on_delete=models.SET_NULL, blank=True, null=True, default=None)
def __str__(self):
if self.area1 is not None:
return self.area1.area1
else:
return self.area2.area2
class ChooseYourArea(models.Model):
area = models.ForeignKey(ParkingAreas, on_delete=models.SET_NULL, blank=True, null=True)
# some other stuff
Теперь я могу получить все зоны парковки в одном месте, даже с возможностью выбора с помощью выпадающего меню, и хранить их в поле ForeignKey.
Таким образом, когда мне понадобится доступ к зонам, я смогу сделать несколько django-запросов и получить то, что мне нужно.