Есть ли способ добавить дополнительные поля в неявную таблицу типа "многие ко многим" в Django?

Рассмотрите следующие модели

в models.py:

class Volunteer(models.Model):
    account = models.OneToOneField(
        UserAccount,
        on_delete=models.CASCADE,
        related_name= "volunteer",
        primary_key=True)


    request_offers = models.ManyToManyField('Request', related_name="volunteers", blank = True)
    volunteer_communities = models.ManyToManyField('Community', related_name="volunteers", blank = True)
class Request(models.Model):
    req_type = models.ForeignKey('RequestTypes', related_name="requests", on_delete = models.CASCADE, blank = False, null = False)

У добровольца может быть много request_offers (тип запроса).

В неявной таблице appname_volunteer_request (many-to-many) мне нужно еще одно поле под названием date помимо полей по умолчанию - id, request_id и volunteer_id.

Есть ли способ добавить дополнительное поле в неявную таблицу без создания сквозной таблицы?

Спасибо! :)

К сожалению, нет способа сделать это без сквозной таблицы.

Вы можете попытаться создать еще одну таблицу, где id сквозной таблицы будет сопряжен с датой, и затем изменять его всякий раз, когда сигнал срабатывает на тщательной таблице. Другой вариант - управлять этим вручную, переопределяя методы менеджера save, delete, create и методы менеджера отношений add, clean, remove, set


Информация, которая может вам помочь: https://docs.djangoproject.com/en/3.2/ref/signals/#post-save https://docs.djangoproject.com/en/4.0/topics/db/models/#intermediary-manytomany

The simplest and most elegant way to do this is with a through=… model [Django-doc], this will eventually require the least amount of work to keep data in sync. In your through model, that will act as a junction table [wiki], you can specify a DateTimeField or any other field:

class Volunteer(models.Model):
    # …
    request_offers = models.ManyToManyField(
        'Request',
        related_name='volunteers',
        through='VolunteerRequest',
        blank = True
    )

class Request(models.Model):
    req_type = models.ForeignKey(
        'RequestTypes',
        related_name='requests',
        on_delete = models.CASCADE
    )

class VolunteerRequest(models.Model):
    volunteer = models.ForeignKey(
        Volunteer,
        on_delete=models.CASCADE
    )
    request = models.ForeignKey(
        Request,
        on_delete=models.CASCADE
    )
    date = models.DateTimeField(auto_now_add=True)

Создание большего количества таблиц потребует дополнительной логики для поддержания синхронизации этих таблиц, а также часто усложнит запросы и сделает базу данных менее эффективной.

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