Как обновить поле в модели с помощью поиска ForegnKey? - PullRequest
0 голосов
/ 29 октября 2019

Мне нужно иметь возможность обновить поле num_places в модели Event, получая к нему доступ через event ForeignKey в модели Participant при сохранении последнего.

Вот мои models.py :

class Event(models.Model):
    name = models.CharField(max_length=50)
    description = models.CharField(max_length=500)
    text = models.TextField()
    image = models.ImageField(blank=True)
    date = models.DateTimeField()      
    price = models.PositiveIntegerField()
    num_places = models.PositiveIntegerField(default=50)       
    slug = models.SlugField()

class Participant(models.Model):
    name = models.CharField(max_length=200)
    participant_uuid = models.UUIDField(primary_key=False, verbose_name='UUID')
    email = models.EmailField()
    phone_regex = RegexValidator(regex=r'^\+7\d{10}$')
    phone_number = models.CharField(validators=[phone_regex], max_length=12)
    num_places = models.PositiveIntegerField(default=1)        
    event = models.ForeignKey(Event, on_delete=models.CASCADE)
    paid = models.BooleanField(default=False)

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        try:
            self.full_clean(exclude=None)
            self.event.num_places -= self.num_places # the value isn't updated
            super().save(*args, **kwargs)
            self.valid = True
            self.non_field_errors = False
        except ValidationError as e:
            self.non_field_errors = e.message_dict[NON_FIELD_ERRORS]
            self.valid = False

    class Meta:
        unique_together = ('name', 'email', 'phone_number', 'event')

Код с комментарием имеет проблему: значение num_places в модели Event остается неизменным. Как это исправить?

1 Ответ

1 голос
/ 29 октября 2019

вам нужно сохранить модифицированный объект Event. self.event.save ()

 def save(self, *args, **kwargs):
    try:
        self.full_clean(exclude=None)
        self.event.num_places -= self.num_places # the value isn't updated
        self.event.save()
        """watch out this since you wanna do it at the end after setting valid, and non_fieild_errors"""
        super().save(*args, **kwargs)
        self.valid = True
        self.non_field_errors = False
    except ValidationError as e:
        self.non_field_errors = e.message_dict[NON_FIELD_ERRORS]
        self.valid = False
...