0

次のモデルがあります(簡略化):

class InscriptionDate(models.Model):
    start_date = models.ForeignKey('Date', related_name='+')
    end_date = models.ForeignKey('Date', related_name='+')
    dates_in_range = models.ManyToManyField('Date', blank=True)

class Date(models.Model):
    year = models.IntegerField(max_length=4)
    era = models.CharField(max_length=2, choices=ERA_CHOICES, default=BC)

開始日と終了日が選択された後、保存時にdates_in_rangeに関連するすべての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 関係の完全なリストを生成して追加できますか?

4

2 に答える 2

0

なぜだめですか?save()m2ms を追加するには PK が必要なので、呼び出しの/後/にこれを行うことを忘れないでください。

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)
于 2012-10-07T01:56:04.663 に答える
0

既に持っているコードを簡単に使用して、保存後のシグナルを使用して実装できます

例えば

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)

多対多の関係の代わりに、dates_in_range をメソッドとして実装することもできますが、実際にはモデルの使用方法に依存します。

例 (start_date と end_date の間のすべての年の Date オブジェクトが既にあり、すべての時代が AD であると仮定します)

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')
于 2012-10-07T02:03:43.547 に答える