有没有办法在 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>
创建更多的表只会需要额外的逻辑来保持这些表的同步,并且通常会使查询变得更加复杂,并且会降低数据库的效率。
考虑以下模型
在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>
创建更多的表只会需要额外的逻辑来保持这些表的同步,并且通常会使查询变得更加复杂,并且会降低数据库的效率。