Скопируйте все поля экземпляра модели Django - PullRequest
6 голосов
/ 30 сентября 2010

хорошо, я думаю, что это очень просто, но так как я новичок в Django, я не знаю, как с этим справиться.

Мне нужно скопировать экземпляр django-модели. Как объяснено здесь , существует проблема с копированием отношений ManyToMany. Но вложение "django-model-copying.diff" имеет эту функцию, я думаю. Так что я не знаю - у моего Django уже есть эта функция? Я не знаю, как это назвать. Помощь будет оценена.

Ответы [ 4 ]

4 голосов
/ 10 марта 2013

Документы содержат инструкции о том, как это сделать, в том числе о том, как справляться со многими отношениями.

4 голосов
/ 01 октября 2010

Вы можете просто сделать следующее:

m = MyModel.objects.get(pk=1)
m.id = None
m.save()

Таким образом, новый экземпляр будет создан с новым id, конечно, в случае любых свойств unique он вызовет ошибки во время проверки.

ПРИМЕЧАНИЕ: Что касается упомянутой вами функции - она ​​еще не добавлена ​​в транк, статус равен design decision needed, но если вы знаете, что делаете, вы можете применить вручнуюРазница в вашем экземпляре Django - это называется исправление между прочим.Вот некоторые подробности о том, как это сделать: http://ariejan.net/2007/07/03/how-to-create-and-apply-a-patch-with-subversion/.

1 голос
/ 10 марта 2013

Я постараюсь ответить на вашу актуальную проблему, потому что то, о чем вы спрашиваете в этом вопросе, - это проблема с вашим предлагаемым решением, которое, как отмечали многие, не совсем идеально.

В комментариях вы упомянули это:

Я постараюсь объяснить. Итак, у нас есть 2 модели: Пользователь и Книга.У пользователя есть книга под названием «Титаник» с некоторым содержанием.Теперь другой пользователь тоже хочет иметь отношение к этой книге.Но второй пользователь хочет точно такую ​​же книгу, но она должна называться «Корабль идет под». Я скопировал бы книгу и переименовал ее.- Я знаю, я мог бы также поместить содержание книги в другую модель - но моя модель немного сложнее.

Похоже, вам нужно отследить три вещи:

  1. Пользователи
  2. Их книги
  3. Некоторые пользовательские заметки, которые пользователи имеют о своей "собственной" книге.

Для каждого Book храните его общиеинформация, например:

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

    def __unicode__(self):
        return unicode(self.name)

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ManyToMany(Author)
    isbn = models.CharField(max_length=13)
    # and so on

    def __unicode__(self):
        return unicode(self.title)

Теперь вам нужно сохранить Книгу -> Отношение пользователя, например, у одного пользователя может быть много книг, у двух пользователей может быть одна и та же книга с прикрепленной мета-информацией.

class BookClub(models.Model):
     username = models.ForeignKey(User)
     book = models.ForeignKey(Book)
     comments = models.TextField()

Если вы структурируете свои модели таким образом, вы сможете выполнять такие запросы:

  • «Сколько книг у каждого участника?»
  • «Какая книга самая популярная?»
  • «Какая книга наименее популярна?»
  • «Какой автор самый популярный?»
0 голосов
/ 17 апреля 2016

Стоит отметить, что с django 1.8 у вас может быть UUIDFields. Если вы скопируете экземпляр модели, а затем сохраните его, ограничение unique не будет выполнено для этого столбца, и в этом случае вы должны сделать что-то вроде:

import uuid
m = MyModel.objects.get(pk=1)
m.pk = None
m.uuid = uuid.uuid4() //generate new uuid
m.save()
...