2014-10-01 3 views
0

У меня есть модель:Создание новой модели экземпляров из существующих

class MyModel(models.Model): 
    fieldA = models.IntegerField() 
    fieldB = models.IntegerField() 
    fieldC = models.IntegerField() 

Теперь, давайте получить QuerySet, например,

qs = MyModel.objects.all() 

Я хотел бы быть в состоянии изменить fieldB и fieldC всех экземпляров в qs с тем же значением и сохранять их как новые записи в моей базе данных. Мне нужно что-то похожее на qs.update(fieldB=2, fieldC=3), но я не хочу переопределять исходные записи в qs. Есть ли способ Django сделать это (то есть, что-то не связано с закодированным вручную циклом for)?

+0

Не уверен, как я отмечаю дубликат (новичок на этом сайте), но ваш ответ здесь: http://stackoverflow.com/questions/4733609/how-do-i-clone-a-django-model-instance- object-and-save-it-to-the-database – michaelb

+0

Спасибо, но это относится к одному экземпляру, есть ли способ сделать это для всех экземпляров? (опять-таки, что-то иное, чем обычный цикл 'for', возможно, что-то, что вставляет все записи с одним запросом). – Sirion

ответ

0

Я не знаю о вызове Django, который сделает то, что вы хотите в одном вызове, например update.

Это самое близкое, с чем я смог приехать. Если предположить, что объекты, которые вы хотели оперировать в qs тогда:

MyModel.objects.bulk_create(
    MyModel(**{pair[0]: pair[1] for pair in x.iteritems() 
       if pair[0] != MyModel._meta.pk.name}) 
    for x in qs.values()) 

Примечания:

  1. qs.values() возвращает один словарь для каждого объекта в qs.

  2. Выражение {pair[0]...} - это понимание словаря, которое создает новый словарь минус первичное поле, определенное на MyModel.

  3. MyModel(**...) создает новый объект MyModel с его первичным ключом, установленным на None. Он эффективно создает копию.

  4. bulk_create создает все объекты в одном запросе. Он имеет caveats, о котором следует знать.

Если для этого нужно отметить, что у вас есть здесь Dict и списочные, а не for петли.

Смежные вопросы