Django更新queryset以更改ForeignKey的ID

时间:2015-01-19 07:07:14

标签: python django django-queryset

我正在尝试更新一堆对象的ID以及引用这些对象的相关表。

class Test(models.Model):
    id=models.IntegerField(primary_key=True)

class Question(models.Model):
    id=models.AutoField(primary_key=True)
    test=models.ForeignKey('Test',db_column='testId')


d={1:2,5:10}

for fr,to in d.items():
    Test.objects.filter(id=fr).update(id=to)
    Question.objects.filter(test_id=fr).update(test_id=to)

我已尝试test_idtest__idtestId,但收到此错误消息:

django.db.models.fields.FieldDoesNotExist: Question has no field named 'test_id'

这目前可能吗?

编辑:我不希望为每次更改ID加载Test对象。

2 个答案:

答案 0 :(得分:11)

在Django 1.8中实现

用法:

Bar.objects.filter(pk=foo.id).update(a_id=bar.id)
Bar.objects.filter(pk=foo.id).update(a=bar.id)

请参阅ticketcommit

答案 1 :(得分:7)

您无法使用ID更新ForeignKey字段。您应该传递模型对象来更新它。你可以尝试

for fr,to in d.items():
    Test.objects.filter(id=fr).update(id=to)
    test_obj = Test.objects.get(id=to)
    Question.objects.filter(test_id=fr).update(test=test_obj)

Refer Documentation

更新

从Django 1.8开始,您可以使用ForeignKey对象的id来更新对象。

for fr,to in d.items():
    Test.objects.filter(id=fr).update(id=to)
    Question.objects.filter(test_id=fr).update(test_id=to)