создать функцию для копирования объекта в модели django

#django #django-models

Вопрос:

мне нужно создать функцию для копирования объекта моей модели моего кода:

 class Author(models.Model):
    name = models.CharField(max_length=50)

class BlogPost(models.Model):
    title = models.CharField(max_length=250)
    body = models.CharField(max_length=None)
    author = models.ForeignKey(Author ,on_delete=models.CASCADE)
    data_created = models.DateTimeField(auto_now_add=datetime.now)
    def copy(self):
       new_post =  BlogPost.objects.get(id=self.id).update(data_created=datetime.now)
       new_post.save()
       return new_post.id


class Comment(models.Model):
    blog_post = models.ForeignKey(BlogPost , on_delete=models.CASCADE)
    text = models.CharField(max_length=500)
 

def копирование в классе BlogPost для копирования obejcts и создания новых объектов и обновления data_created до настоящего времени, после чего у меня будет 2 объекта, но что я могу сделать?

Ответ №1:

Код, который вы показываете, не копируется, он просто обновляет время для одного и того же объекта без создания нового объекта.

Один «простой» вариант, если вы хотите выполнить копирование внутри метода модели:

 from django.utils import timezone as tz

class BlogPost(models.Model):
    ...

    def copy(self):
        # this is a method of the model, so 'self' holds the 
        # object already, so no need to use '.objects.get()'
        new_post = BlogPost()
        new_post.title = self.title
        new_post.body = self.body
        new_post.author = self.author
        new_post.data_created = tz.now()
        new_post.save()
 

Примечание: рекомендуется использовать timezone.now() вместо datetime.datetime.now() , см. https://docs.djangoproject.com/en/3.2/topics/i18n/timezones/#naive-and-aware-datetime-objects