問題

當我們使用ORM和使用外來鍵的一些模型時,我有點困惑Django如何處理’_id’屬性. 例如:

 class CartItem(models.Model):
    user = models.ForeignKey('accounts.CustomUser', related_name='carts', on_delete=models.CASCADE, verbose_name='User')
    product = models.ForeignKey('pizza.Product', related_name='carts', on_delete=models.CASCADE, verbose_name=_('Product'))
    quantity = models.SmallIntegerField(verbose_name=_('Quantity'))
 

當我使用ORM與’filter’時,我可以輕鬆使用類似的東西:

 CartItem.objects.filter(user=1, product=1, quantity=1)
 

和Django型別的’seec’我引用’id’,但是當我正確地使用相同的程式碼行時,但是使用’create’而不是’filter’:

 CartItem.objects.create(user=1, product=1, quantity=1)
 

然後它丟擲一個錯誤說:

無法分配“1”:“CartItem.user”必須是“CustomUser”例項.

並建立它我需要使用:

 CartItem.objects.create(user_id=1, product_id=1, quantity=1)
 

為什麼會這樣?這裡有一些我不明白的規則嗎?

  最佳答案

這是資料庫表示ForeignKey [Django-doc] .對模型物件的引用表示為:

在幕後,Django將"_id"附加到欄位名稱以建立其資料庫列名.在上面的示例中,Car模型的資料庫表將有一個manufacturer_id列. (您可以透過指定db_column明確更改此)但是,除非您編寫自定義SQL,否則您的程式碼永遠不必處理資料庫列名.您將始終處理模型物件的欄位名稱.

所以你可以說,Django將構建一個帶有_id字尾的“雙重”列.此列具有與您目標模型的主鍵型別相同的型別,因此該列將包含您使用的模型物件的主鍵.請注意,您可以透過指定 to_field=…引數[Django-doc] 使用您目標的不同欄位.

因此,ForeignKey本身在資料庫中不存在,這是Django的邏輯,它將使用該物件的主要內容,並將其儲存在預設情況下使用_id字尾的列中.

  相同標籤的其他問題

pythondjangodjango-orm