2014-09-05 58 views
2

這裏是我的models.pyDjango的get_or_create方法不返回確切的對象

class Foo(models.Model): 
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=30) 

在Django manage.py shell

>>> a,b = Foo.objects.get_or_create(name='hi') 
>>> b 
True 
>>> vars(a) 
{'_state': <django.db.models.base.ModelState object at 0x02761390>, 'id': None, 
'name': 'hi'} 

這裏的問題是定製id屬性沒有價值。如果我繼續做到以下幾點:

>>> c = foo.objects.get(name='hi') 
>>> c.id 
1 
>>> a is c 
False 

使新創建的對象(由c表示)現在已經存在,但b不是一個精確的參考它像c是。

這是一個錯誤?我的django版本是1.6.5。

+0

你爲什麼要比較'b'和'c'? 'b'是由'get_or_create'返回的布爾「created」,'c'是對象。 – coldmind 2014-09-05 09:11:00

+0

@coldmind對不起。只是糾正它,問題仍然存在。 – wlnirvana 2014-09-05 10:46:10

回答

4

默認情況下,如果沒有指定ID字段你的模型,Django will create下拉列表AutoField:

id = models.AutoField(primary_key=True) 

在你的情況,你已經創建只是IntegerField。我想這是關鍵。在數據庫中,它仍然會遞增,但Django將不會從數據庫中指定的值id對象,通過get_or_create

返回順便說一句,在你的問題:

>>> b is c 
False 

b - 是一個布爾值。我想你試圖做

>>> a is c 

但這也不是一個好主意。如果要比較的Django模型對象,請使用==,不is

>>> a == c 

你會得到False反正aid設置爲None

2

你已經聲明你的id字段爲IntegerField,所以Django不知道它需要自動增量。你可以將它定義爲一個AutoField,但實際上根本沒有理由聲明它:如果你沒有聲明,Django會自動爲你定義它。

請注意,這與get_or_create無關:對於正常的創建/保存,您將遇到完全相同的問題。

+0

**不知道它需要自動增加**是什麼意思?我仍然得到'c.id == 1'。 – wlnirvana 2014-09-05 11:22:47

+1

嘗試使用沒有id字段的相同模型。 (它是自動創建的!) – abrunet 2014-09-05 11:35:52