2016-03-15 57 views
1

我會用在內容類型對象非主鍵,如下所示:是否有可能使用對象的非主鍵的contenttype?

我的內容類型的模型:

class Vote(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    object  = generic.GenericForeignKey('content_type', 'object_uid') 
    vote   = models.SmallIntegerField() 

與我的其他模型:

class Task(models.Model): 
    uid=uid = models.UUIDField(default=uuid.uuid4, unique=True) 
    title = models.CharField(_('Title'), max_length=128, help_text=_('Title')) 
    votes = GenericRelation(Vote) 

現在,該模式得到建立,我能夠創建對象,而不是檢索: 以下不工作:

t = Task.objects.create(title='task1') 
t.votes.all() 

我得到以下錯誤:

django.db.utils.ProgrammingError: operator does not exist: uuid = integer 
LINE 1: ..."content_type_id" = 19 AND "vote"."object_uid" = 16) ORDE... 

現在我明白這個錯誤,我的理解,它試圖評估對的UUID整數。 有沒有一種方法,以表明它應該使用uid領域而不是pk Django的?

回答

4

簡短的回答:不,這是不可能使GenericForeignKey使用任何其他目標字段不是主鍵。主鍵是硬編碼在GenericForeignKeyGenericRelation,以及一些支持類的(內聯,相關的描述,那種事)。

如果您確實想使用UUID作爲目標字段,那麼您必須將UUID字段設置爲目標型號的主鍵,並使用與UUID兼容的類型Vote.object_id(例如CharField ,甚至是TextField - 這樣您仍然可以指向帶有整數主鍵的模型)。

+0

太糟糕了它沒有參數。 –

+0

你會如何想象API來定製什麼字段是'GenericForeignKey'的目標?我可以拿出兩個選擇,他們都難看:要麼指定每個模型字段名覆蓋的字典到'GenericForeignKey'本身,這是甜的,因爲如果你想定製目標幾款機型,你會最終在GFK定義中有一個很大的洗衣清單;另一個是在'GenericRelation'中指定它,這很醜陋,因爲那麼'GenericRelation'會改變其他地方定義的GFK的行爲。 – koniiiik

相關問題