我正在尝试设置一个促销代码系统,该系统会自动获得符合条件的用户/学生的声明(由M2M或以逗号分隔的电子邮件字符串指定)。
以下是该模型的相关代码:
class PromoCode(models.Model):
students_claimed = models.ManyToManyField('Student', blank=True, related_name='promo_codes_claimed')
claimable_by = models.ManyToManyField('Student', blank=True, related_name='claimable_promo_codes')
claimable_by_emails = models.CharField(max_length=10000, null=True, blank=True)
def save(self, *args, **kwargs):
if self.claimable_by_emails:
for email in self.claimable_by_emails.split(','):
try:
student = Student.objects.get(user__email=email)
student.claim_promo_code(self)
except Student.DoesNotExist:
pass
for student in self.claimable_by.all():
student.claim_promo_code(self)
super().save(*args, **kwargs)
claim_promo_code
中的Student
方法如下:
def claim_promo_code(self, promo_code):
if promo_code.is_claimable_by(self):
promo_code.students_claimed.add(self)
promo_code.save()
print('TEST')
我知道正在调用claim_promo_code
方法,因为print语句正在运行;但是,用户未被添加/保存到students_claimed
。通过其他方式(claim_promo_code
方法之外)调用save
方法可以按预期工作。
在这里调用对象的save
方法是否有问题,就像这里的情况一样?我应该如何解决这个问题呢?