有没有办法在 Django 中的隐式多对多 table 上添加附加字段?

Is there a way to add additional fields on an implicit many-to-many table in 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(多对多)table 中,除了默认字段 -- id,我还想要另一个名为 date 的字段, request_id 和 volunteer_id.

有没有办法在隐式 table 上添加一个附加字段而不用 通过 table 创建一个字段?

谢谢! :)

不幸的是,没有通过 table。

您可以尝试再创建一个 table,其中通过 table 的 ID 将与日期配对,然后在彻底 table.Other 选项上触发信号时更改它是通过覆盖管理器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

最简单、最优雅的方法是使用 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],您可以指定 DateTimeField 或任何其他字段:

class Volunteer(models.Model):
    # …
    request_offers = models.ManyToManyField(
        'Request',
        related_name='volunteers',
        <strong>through='VolunteerRequest'</strong>,
        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.<strong>DateTimeField(</strong>auto_now_add=True<strong>)</strong>

创建更多的表只会需要额外的逻辑来保持这些表的同步,并且通常会使查询变得更加复杂,并且会降低数据库的效率。