2015-10-10 66 views
0

question似乎是類似於我的目標了,但我得到一個錯誤Django的REST框架IntegrityError試圖在使用時unique_together

IntegrityError column username_id is not unique 

我所尋找的是具有這些字段是唯一的,只有當一起。這意味着同一個roomId和用戶名只能在數據庫中看到一次。
但是,用戶可以看到另一個roomId。重點是避免同一用戶的多次提交和相同的roomId
當我嘗試向另一個roomId提交具有相同用戶名的另一個請求時,會發生上述錯誤。

這裏是我的模型

class Active(models.Model): 
    username = models.ForeignKey(Profile) 
    roomId = models.ForeignKey(Room) 
    activeId = models.UUIDField(primary_key=True, default=uuid.uuid4, 
          editable=False) 
    class Meta: 
     unique_together=(('username', 'roomId',)) 

我使用SQLite和。

我認爲unique_together約束做到了這一點,但看起來並不像它。什麼是正確的方法?

編輯

我結束了重寫perform_create並確認沒有行包含此link節省像以前這兩個鍵。

def perform_create(self, serializer): 
    queryset = Active.objects.filter(username=serializer.data.get('username')).filter(roomId=serializer.data.get('roomId')) 
    if queryset.exists(): 
     raise ValidationError({"detail" : "dont be silly"}) 
    serializer.save() 

似乎工作正常。

問候

+0

您將不得不重寫您正在使用的視圖集或序列化程序中的create方法。 :) – debuggerpk

+0

你能否解釋爲什麼採取這種方法,以及unique_together作爲答案的目的是什麼? – Clocker

+0

你有沒有建立一些信號? – Roba

回答

0

對不起,已經回答了:Django Unique Together (with foreign keys)

你在找什麼可能已經由多對多的關係提供。你可以在用戶或房間中使用這種關係嗎?

+0

我想我可以。相反,我最終覆蓋了我的視圖中的perfrom_create(self,serializer)。執行過濾器並檢查它是否存在。隨着DB變大,我確實懷疑這種方法的性能。 – Clocker

+0

會有性能影響,但我會說這是微不足道的 - 它只發生在對象創建。解決這個問題的另一種方法是編寫一個自定義對象管理器來覆蓋create方法。通過這種方式,您可以儘可能地使條件儘可能接近dB層,並且也可以爲管理站點提供這種驗證。 – Roba