Есть ли способ добавить дополнительные поля в неявную таблицу типа "многие ко многим" в 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)
Создание большего количества таблиц потребует дополнительной логики для поддержания синхронизации этих таблиц, а также часто усложнит запросы и сделает базу данных менее эффективной.