簡體   English   中英

Django 模型從外鍵中獲取值

[英]Django Models get value from a foreign key

我有以下 model:

class Check (models.Model):
    
    user_id     = models.ForeignKey(Client, on_delete=models.CASCADE)
    client = Client.objects.get(pk=1) #change id according to user_id
    client_birth = client.birth
    client_gender = client.gender

我需要的是從 model 客戶端獲取這些出生和性別值,但要根據 user_id 上設置的值 id。 那可能嗎?

目前您有 check.user_id 作為客戶端 object,然后 check.client 作為另一個客戶端 object 匹配 client_id 1。

我不確定您的措辭,但我認為您的期望是 user_id 正在提取一個 id (整數)值,並且客戶端正在使用該用戶 ID 獲取客戶端 object。

你能解釋一下你想要做什么嗎?

編輯

根據您的評論,我仍然不完全確定,但我認為您想要的是這個。 讓我們假設您希望 Check class 執行的操作只是在命令行中將有關客戶端的一些基本信息打印到屏幕上。 顯然你的 do_stuff 方法會是別的東西。

from django.db import models

class Client(models.Model):
    name = models.CharField(limit=50)
    birth = models.DateField()
    gender = models.Charfield()
    
class Check (models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE)

    def do_stuff(self):
        print(f'This is the client name: {self.client.name}')
        print(f'This is the client birth date: {self.client.birth_date}')
        print(f'This is the client gender: {self.client.gender}')

如果要從 model 中訪問它們,則不需要將出生和性別存儲為它們自己的 Check 屬性。 它更清潔只是通過客戶端 object 引用它們。

然后調用您的 class 和方法,您將執行以下操作:

client = Client.objects.create(name='Dave', birth='2000-01-01', gender='male')
checker = Check.objects.create(client=client)
checker.do_stuff()

如果您想將出生和性別存儲為client_birth = client.birthclient_gender = client.gender以傳遞給視圖或其他內容,您也可以這樣做。

如果我的問題是正確的,那么答案應該在這里:

以其他模型/形式訪問 Model 數據

干杯

模型是您的數據庫表的骨架,所有的業務操作 go 在表單/視圖集/序列化器中。

您在這里嘗試做的是:

class Check (models.Model):
    user_id = models.ForeignKey(Client, on_delete=models.CASCADE)
    client = Client.objects.get(pk=1) #change id according to user_id
    client_birth = client.birth
    client_gender = client.gender
    
    
class Client (models.Model):
    gender = models.CharField()
    birth = models.DateField()

結果將是:

## Client Table ##

id      gender      birth
1       M           1/1/89
2       F           2/2/90
3       M           3/3/91


## Check Table ##

id      user_id     
1       1

它不會在檢查表中創建任何其他內容。

你的代碼模型應該是這樣的:

class Check (models.Model):
    user_id = models.ForeignKey(Client, on_delete=models.CASCADE)
    # (Assuming there are other fields in Check model , else theres no use of this)
    
class Client (models.Model):
    gender = models.CharField()
    birth = models.DateField()

然后在您的自定義創建/更新方法中,您必須編寫有關您必須檢查的邏輯:

user_id = (you get it from request or user input maybe , not sure what your requirements are)
client = Client.objects.get(pk=user_id)
client_birth = client.birth
client_gender = client.gender
# Rest of the code and save/update

在我看來,檢查 model 沒有任何意義,它必須在表單/序列化程序中的 go 在創建或保存到數據庫之前實際檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM