Django - автоматически сохранить копию идентификатора объекта во второй таблице - PullRequest
0 голосов
/ 28 апреля 2020

Я хочу, чтобы мое приложение Django также сохраняло идентификатор вновь созданного объекта Post в моей таблице Post_Collection, как только для этого был создан фактический объект Post. Я попробовал следующее решение, которое, к сожалению, пока ничего не делает:

models.py

collectable_post_models = models.Q(app_label='App', model='post_model1') | models.Q(app_label='App', model='post_model2') | models.Q(app_label='App', model='post_model3')

class Post_Collection(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    content_type = models.ForeignKey(ContentType, limit_choices_to=collectable_post_models,
                                     related_name='collections', related_query_name='collection',
                                     on_delete=models.CASCADE, null=True, blank=False)
    object_id = models.CharField(max_length=36, blank=False)
    content_object = GenericForeignKey('content_type', 'object_id')
    date_added = models.DateTimeField(auto_now_add=True, blank=False)

    class Meta:
        unique_together = ('content_type', 'object_id')
        verbose_name = "Post Collection - HELPER TABLE"
        verbose_name_plural = "Post Collections - HELPER TABLE"
        ordering = ['-date_added']

    # currently not working
    @receiver(post_save, sender=Post)
    def ensure_post_exists(sender, **kwargs):
        if kwargs.get('published_date', False):
            Post_Collection.objects.get_or_create(post=kwargs.get('instance'))

Я ожидаю, что каждый раз, когда я создаю новый элемент Post, идентификатор также сохраняется в таблице Post_Collection.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Исправлена ​​проблема следующим образом:

def save(self, *args, **kwargs):
...
  if not Post_Collection.objects.filter(object_id=self.pk).exists():                     
     Post_Collection.objects.create(content_object=self)

def delete(self, *args, **kwargs):
...
  Post_Collection.objects.filter(object_id=self.pk).delete()

Я просто добавил это в модель, которую хотел отправить в индекс коллекции. Если сообщение теперь будет создано или удалено, оно будет либо добавлено, либо удалено из индекса Post_Collection.

0 голосов
/ 29 апреля 2020

Если у вас есть поле post в Post_Collection (оно не отображается в определении модели, но вы назначаете его в последней строке), вы можете сделать что-то вроде:

class Post(models.Model):
     # fields

     def save(*args, **kwargs):
         is_new = not self.pk

         super(Post, self).save(*args, **kwargs)

         if is_new:
             Post_Collection.objects.get_or_create(post=self)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...