17

モデル内の値をオーバーライドすることは可能ですか? 「 MyModel 」オブジェクトはアイテムの割り当てをサポートしていません。

my_model = MyModel.objects.get(id=1)
print my_model.title

if my_model.is_changed:
    my_model['title'] = 'something' # 'MyModel' object does not support item assignment

params = {
        'my_model': my_model,
         ...
    }
return render(request, 'template.html', params)
4

3 に答える 3

36

モデルはオブジェクトであり、辞書ではありません。それらに属性を直接設定します。

if my_model.is_changed:
    my_model.title = 'something'

または、属性名が動的な場合は、次を使用しますsetattr

attr_name = 'title' # in practice this would be more complex
if my_model.is_changed:
    setattr(my_model, attr_name, 'something')

これにより、モデルのメモリ内コピーが変更されますが、データベースは変更されません。そのため、属性はフィールドである必要があり、saveon のメソッドを呼び出す必要がありますmy_model。テンプレートがそのコンテキストで受け取るものを変更したいだけの場合は、それを行う必要はありませんが、完全を期すためだけです:

if my_model.is_changed:
    my_model.title = 'something'
    my_model.save()

実際に辞書がある場合、辞書は変更可能です。

mydict = {'title': 'foo'}
# legal
mydict['title'] = 'something'

しかし、すべてが辞書ではありません。

于 2013-09-12T08:50:46.283 に答える
2

はい、値を変更できますが、これはその方法ではありません。Django モデルは、フィールドを表すモデルを持つ Python クラスです。たとえば、 aCharFieldはデータベースに文字列を保持するためのものです。実演させてください(django docsのコード):

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

上記のように、Python クラスはカスタム Django モデルです。これはデータベースにリンクされており、実行するmanage.py syncdbとデータベースと対話して、必要なテーブルと列を作成します。

さて、あなたの場合:

if my_model.is_changed:
    my_model.title = "Something"
    my_model.save()
于 2013-09-12T08:51:16.967 に答える
0

my_model はオブジェクトです。だから、これを試してください:

if my_model.is_changed:
    my_model.title = 'something'
    my_model.save()
于 2013-09-12T08:52:55.913 に答える