Обновление datetimefiled всех связанных моделей при обновлении модели - PullRequest
0 голосов
/ 18 июня 2019

У меня две модели (Post и Display).Оба имеют поля Datetime-auto.Моя проблема заключается в том, что я хочу обновить все экранные объекты, связанные с сообщением, после обновления сообщения.

Я прочитал здесь, что вы можете переопределить один метод сохранения моделей, но все примеры относятся к обновлению модели.с внешним ключом в нем, а затем вызвать метод сохранения другой модели.В моем случае это наоборот.Как я могу это сделать ?

class Post(models.Model):
    title = models.CharField(max_length=40)
    content = models.TextField(max_length=300)
    date_posted = models.DateTimeField(auto_now=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    rooms = models.ManyToManyField(Room, related_name='roomposts',  through='Display')


    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return "/post/{}/".format(self.pk)

class Display(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    room = models.ForeignKey(Room, on_delete=models.CASCADE)
    isdisplayed = models.BooleanField(default=0)
    date_posted = models.DateTimeField(auto_now=True)

    def __str__(self):
        return str(self.isdisplayed)

Я хочу обновить date_posted всех связанных экранных объектов после изменения их соответствующей записи.Я не знаю, работает ли здесь переопределение метода сохранения.

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Превосходящий метод сохранения работает, но это не то, куда вы должны идти, imo.

То, что вам нужно, это сигналы:

@receiver(post_save, sender=Post)
def update_displays_on_post_save(sender, instance, **kwargs):
    if kwargs.get('created') is False:  # This means you have updated the post
        # do smth with instance.display_set

Обычно это входит в signals.py.Также вам нужно включить это в свой AppConfig

def ready(self):
    from . import signals  # noqa
1 голос
/ 18 июня 2019

в этом случае вы должны взглянуть на документацию обратного внешнего ключа django https://docs.djangoproject.com/en/2.2/topics/db/queries/#following-relationships-backward

, в вашем случае вы можете переопределить метод сохранения в вашей модели Post

def save(self, *args, **kwargs):
    super().save(*args, **kwargs)
    #either: this excutes many sql statments
    for display in self.display_set.all():
        display.save()
    #or faster: this excute only one sql statements,
    #but note that this does not call Display.save
    self.display_set.all().update(date_posted=self.date_posted)

Имяdisplay_set можно изменить с помощью параметра related_name

на дисплее, вы можете изменить его:

post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='displays')

Затем вместо использования self.display_set всвой код вы можете использовать self.displays

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...