iT邦幫忙

0

Python+Django如何去撈出正確的FK資料內容?

  • 分享至 

  • xImage

請教各位前輩

我用Python+Django的架構,我想在畫面的"備註"欄位,顯示出正確的內容,但不知道要怎麼去撈PK對應到FK的資料,一直都撈錯 @@

狀況問題:我從"SoftWare"這張表,去對應到 "Memo"這張表,要去db內撈出資料回來,但都會變成撈到 "Memo"的id,抓到的內容就不是我要的資料內容.
我該怎麼修改才對? (舉例:software_id : 4 要撈出 Memo id: 8 資料內容)
謝謝各位前輩

附上code及db和畫面圖片

畫面
畫面

db
db

Models - Memo

class Memo(models.Model):
	notes = models.TextField()
	software = models.ForeignKey(Software, on_delete=models.CASCADE)
	timestamp = models.DateTimeField(default=timezone.now)

	def __str__(self):
		return self.notes

Models - Software

class Software(models.Model):
	STATUS_CHOICES = [
		(0, '規劃中'),
		(1, '開發中'),
		(2, '使用中'),
		(3, '已廢棄')
	]
	name = models.CharField(max_length=100, verbose_name="系統名稱")
	url = models.CharField(max_length=100, verbose_name="系統網址")
	status = models.PositiveIntegerField(default=0, choices=STATUS_CHOICES,  verbose_name="目前狀態") 
	company = models.ForeignKey(Company, on_delete=models.CASCADE,  verbose_name="開發公司或單位")
	team = models.ForeignKey(Team, on_delete=models.DO_NOTHING,  verbose_name="所屬組別")
	def __str__(self):
		return self.name

Templates

<form method="POST" name="myform" action="." >
{% csrf_token %}
<table class="table table-striped">
    <tr>
        <td align=right>新增備註:</td>
        <td>
            <input type=text size=50 name="notes" value='{{target_Memo.notes}}'>
        </td>
    </tr>
    <tr>
        <td> </td>
    <td>
        <input type=submit value="送出">
    </td>
    </tr>
</table>
</form>
{% endblock %}

Views

def add_showmemo(request,id=None,logmemo=None):
    logged_user = User.objects.get(username=request.user.username)
    logged_user = UserProfile.objects.get(user=logged_user)
    if request.method=="POST":
        unit = Memo.objects.get('notes')
    try:
        target_Memo = Memo.objects.get(id=id)
        #target_Memo.save()
    except Exception as e:
        print(e)
        return redirect("/showdetail/")        
    return render(request, "add_showmemo.html", locals())
froce iT邦大師 1 級 ‧ 2022-04-26 17:12:53 檢舉
我實在看不懂你要啥,但建議去把下面文章好好看完。這只是外鍵的存取而已。
另外建議加 related_name
https://docs.djangoproject.com/zh-hans/4.0/topics/db/examples/many_to_one/
https://docs.djangoproject.com/zh-hans/4.0/ref/models/fields/#django.db.models.ForeignKey.related_name

另外logged_user可以直接用request.user取,不需要這麼麻煩。
https://docs.djangoproject.com/zh-hans/4.0/topics/auth/default/#authentication-in-web-requests
謝謝你的建議
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
camelcheng
iT邦新手 4 級 ‧ 2022-04-26 17:46:35
最佳解答

關於Foriegn key可以先看看這篇
按上述的舉例

(舉例:software_id : 4 要撈出 Memo id: 8 資料內容)

這樣不知道有沒有達到你想做到的事情

try:
    #先取出software表的id
    id = Software.objects.get(pk=4)
    #在Memo表中秀出符合software_id的資料
    target_Memo = Memo.objects.get(software_id=id)

可以撈到資料了,不過您寫的"PK"是有指定;如果不指定PK,則是可以改成pk=pk(剛有測試成功)

不過目前要解決另一個問題,當對應的PK欄位沒有資料,會顯示404錯誤,應該是一樣可以正常顯示畫面並可以新增"備註"的欄位內容

page not found

froce iT邦大師 1 級 ‧ 2022-04-26 19:51:46 檢舉

你urls.py裡沒加 showdetail 這個路徑啊...

我要發表回答

立即登入回答