Столбец внешнего ключа с ключами от разных моделей - PullRequest
1 голос
/ 17 октября 2019

Допустим, у меня есть 4 модели: A, B, C, X

A содержит A1, A2, ... An (аналогично B и C)

У меня есть объект вX, скажем, X1, который относится к объекту из категории A, B или C.

У меня есть столбец в модели X в качестве категории.

Как я могу связать его с различными моделямиA, B и C?

Если это невозможно сделать с помощью одного столбца, каков наилучший способ реализовать это?

Извините, что задали базовый вопрос.

Заранее спасибо:)

1 Ответ

1 голос
/ 17 октября 2019

У вас есть 2 варианта для этой

  1. использования модели (назовем ее Base), которая будет родительской моделью для A, B и C:

    class Base(models.Model):
        # you can put any fields here that are common to A, B and C, but not having any fields here is fine
        pass
    
    class A(Base):
        # fields for A, models B and C will be similar so I'm skipping them
        pass
    

    Теперь вы можете создать внешний ключ для Base в вашей модели X и извлечь специализированную модель на следующем шаге. Чтобы упростить извлечение специализированной модели, вы можете использовать django-polymorphic

  2. Использовать родовое отношение :

    class X(models.Model):
        content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
        object_id = models.PositiveIntegerField()
        content_object = GenericForeignKey('content_type', 'object_id')
    

    Этот подход является более универсальным, но также не дает вам достаточного контроля над тем, на что фактически ссылаются в модели X. Он также не очень хорошо работает с пользовательскими первичными ключами. Также на стороне базы данных нет ограничений, которые будут поддерживать внешние ключи действительными.

...