Как получить 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-запросов и получить то, что мне нужно.

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