Django 在模型中自动生成多个M2M关系

Django 在模型中自动生成多个M2M关系,django,django-models,Django,Django Models,我有以下模型(简化): 我希望在选择开始日期和结束日期后,为保存时的日期范围内的日期生成所有相关的M2M关系。其思想是可以查询范围内的任何日期,并返回与该日期相关的条目 以下是不正确的,但这正是我考虑采取的方法: def save(self): start = self.start_date.year end = self.end_date.year for i in range(start, end): self.dates_in

我有以下模型(简化):

我希望在选择开始日期和结束日期后,为保存时的日期范围内的日期生成所有相关的M2M关系。其思想是可以查询范围内的任何日期,并返回与该日期相关的条目

以下是不正确的,但这正是我考虑采取的方法:

 def save(self):
       start = self.start_date.year
       end = self.end_date.year
       for i in range(start, end):
          self.dates_in_range.add(year)
       super(InscriptionDate, self).save()

可以用这种方式循环M2M关系的add()吗?我可以用这种方式从输入数据生成并添加M2M关系的完整列表吗?

为什么不可以?只需记住在调用
save()
后执行此操作,因为您需要PK来添加m2ms

super(...).save()
self.dates_in_range.clear()
for year in range(start_year, end_year):
    date, created = Date.objects.get_or_create(year=year)
    self.dates_in_range.add(date)

您可以轻松地使用已有的代码,并使用

e、 g

您还可以将日期范围中的日期作为一种方法而不是多对多关系来实现,但这实际上取决于您计划如何使用您的模型

e、 g.(假设在开始日期和结束日期之间的所有年份都有日期对象,并且所有纪元都是AD)


所以应该是这样的
def添加范围内的日期(self):
super(铭文日期,self).save()
start\u year=self.start\u date.year
end\u year=self.end\u year.year
范围内的年份(start\u year,end\u year):
,created=Date.objects.get\u或\u create(year=year)
self.dates\u在\u范围内。add(Date)
super(...).save()
self.dates_in_range.clear()
for year in range(start_year, end_year):
    date, created = Date.objects.get_or_create(year=year)
    self.dates_in_range.add(date)
from django.dispatch import receiver

@receiver(models.signals.post_save, sender=InscriptionDate)
def add_dates_in_range(sender, instance, **kwargs):
    #assumes both years are in AD
    start_year = instance.start_date.year
    end_year = instance.end_date.year
    for year in range(start_year, end_year+1) #to include end_year
        date = Date.objects.get_or_create(year = year, era = 'AD')[0]
        instance.dates_in_range.add(date)
class InscriptionDate(models.Model):
    start_date = models.ForeignKey('Date', related_name='+')
    end_date = models.ForeignKey('Date', related_name='+')
    def dates_in_range(self):
        return Date.objects.filter(year__lte = self.end_date.year, year__gte = self.start_date.year, era = 'AD')