2010-09-30 1 views
6

ok Я думаю, что это очень простой, но поскольку я новичок в Django, я не знаю, как с этим справиться.Скопируйте все поля экземпляра модели django

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

+0

«Мне нужно, чтобы скопировать все Джанго-модель»? Вы имеете в виду клонировать экземпляр модели - т. Е. Клонировать строку в базе данных. Это - вообще - страшная идея. Почему вы клонируете строки базы данных? Весь смысл реляционной модели данных состоит в том, чтобы сделать клонирование строки ненужной. Что делаешь? –

+0

да, ваше право - мне нужно скопировать экземпляр модели. Я хочу скопировать экземпляр со всеми его атрибутами и отношениями к другим моделям. Знаете, я думал об избыточности и прочее - но для моей проблемы - это лучший способ просто скопировать его. – Peter

+0

@Peter: «но для моей проблемы - это лучший способ просто скопировать его». Извините, но это не так. Этого не может быть. У вас есть «отношения» в базе данных, которые делают это совершенно бесполезным. Возможно, вам нужно исправить вашу модель данных, прежде чем идти слишком далеко по этой дороге. –

ответ

4

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

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

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

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

+0

да - я знаю это .. но таким образом он теряет все m2m-отношения .. – Peter

+0

Я думаю, вы могли бы добавить '__copy __()'/'__deepcopy __() 'функции к вашей модели, а затем сохранить значения m2m. Или, может быть, использовать 'pickle' .. Я постараюсь решить эту проблему - довольно интересно;) – bx2

+1

Проблема в том, что вам также нужно скопировать таблицу« через », чтобы указать новую модель на одном конце, указывая на другой конец от отношения. – bx2

4

docs включают указания о том, как это сделать - в том числе, как обращаться со многими из многих отношений.

1

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

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

я постараюсь объяснить .. Так что у нас есть 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

Стоит отметить, что с 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()