在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Python/ django 外鍵model的互相讀取

django 外鍵model的互相讀取

關(guān)系模型如下:

class asset(models.Model):  
   asset_status = models.IntegerField(verbose_name=u'資產(chǎn)狀態(tài)', choices=ASSET_STATUS, default=0)
    name = models.CharField(verbose_name=u'資產(chǎn)名稱', max_length=32)  
   def __str__(self):              
       return self.name
       
class People(models.Model):
    number = models.CharField(u'員工編號(hào)', max_length=30, blank=True, null=True)
    name = models.CharField(u'員工', max_length=30)
    max_borrowing = models.IntegerField(default=2)
    gender = models.CharField(max_length=6, choices=(('male', '男'), ('female', '女')), default='female',
                              null=True, blank=True, verbose_name='性別')
    address = models.CharField(max_length=100, null=True, blank=True, default='', verbose_name='地址')
    mobile = models.CharField(max_length=11, null=True, blank=True, verbose_name='手機(jī)號(hào)')
    email = models.EmailField(max_length=50, null=True, blank=True, verbose_name='郵箱')

    def __str__(self):
        return str(self.name)

    class Meta:
        verbose_name = u'姓名'
        verbose_name_plural = u'員工'
        
class Collar(models.Model):
    people = models.ForeignKey(People, blank=True, null=True, verbose_name=u"領(lǐng)用人")
    asset = models.ForeignKey(Asset, verbose_name=u'資產(chǎn)', null=True)
    collar_time = models.DateField(verbose_name=u"領(lǐng)用時(shí)間", )
    status = models.IntegerField(choices=ASSET_STATUS, verbose_name=u'status', default=1)
    description = models.TextField(verbose_name=u"描述", blank=True)

    def __str__(self):
        return str(self.people)

    class Meta:
        verbose_name = u'資產(chǎn)領(lǐng)用'
        verbose_name_plural = u'資產(chǎn)領(lǐng)用'

上面的數(shù)據(jù)關(guān)系很明晰,Collar中有people和Asset的外鍵,那么我想在asset的詳細(xì)頁(yè)里面看到people是哪個(gè)該怎么操作呢?

我通過(guò)下面獲取到了所有的信息,需要怎么樣的過(guò)濾呢?

collar = Collar.objects.all()
        for e in collar:
            p = e.people
            a = e.asset

這樣就把所有的信息都給整出來(lái)了,有沒(méi)有辦法做到精確到哪個(gè)人領(lǐng)到的資產(chǎn),就顯示出哪個(gè)people到信息呢?

回答
編輯回答
帥到炸
  1. 你的people,asset在Collar的關(guān)系是多對(duì)多,asset與collar的關(guān)系是一對(duì)多

  2. 通過(guò)asset查向collar

collar_set = asset.collar_set.all()// 有多個(gè)
  1. 再向collar_set查向people

for collar in collar_set:
    collar.people

最后,建議在ForeignKey上添加relate_name來(lái)幫助反向查詢,要不就只能用默認(rèn)的查詢名字
django文檔

2018年9月7日 04:53
編輯回答
六扇門

哈哈~我這算是跟蹤了。表格設(shè)計(jì)是挺清晰。
上面的for循環(huán)只會(huì)得到最后一個(gè)循環(huán)的結(jié)果,因此,你并不是獲得了所有的 people 或者 asset。
如果一定要用for的方式做。那么你在for循環(huán)外層要加一個(gè)列表或者字典來(lái)存放你for循環(huán)得到的每一條數(shù)據(jù),之后在模板中又一次for循環(huán)得到每個(gè)子數(shù)據(jù)。(有點(diǎn)多余哈)
所以,建議你看看Django中數(shù)據(jù)庫(kù)操作反向查詢那塊。下面的內(nèi)容也許就是實(shí)現(xiàn)你想法的方法。
asset_item = asset.objects.get(pk=1)
collar_asset = asset_item.asset_set.all() #查詢集,這個(gè)時(shí)候不能直接get,因?yàn)槭遣樵兗?br>first = collar_asset.first() #得到你第一條對(duì)應(yīng)上的領(lǐng)用數(shù)據(jù)
first.people #這個(gè)時(shí)候你才能得到你的領(lǐng)用人信息。
那么問(wèn)題來(lái)了,看你的設(shè)計(jì)本來(lái)應(yīng)該是一個(gè)領(lǐng)用記錄就對(duì)應(yīng)一個(gè)資產(chǎn)的,再?gòu)漠?dāng)前某一資產(chǎn)上找到對(duì)應(yīng)的領(lǐng)用人信息。
但實(shí)際上:一個(gè)資產(chǎn)是有可能被重復(fù)領(lǐng)用的(不同時(shí)間)。所以,上面三個(gè)表格的設(shè)計(jì)可能并不是你想要的。

仔細(xì)看了一下上面三張表格的設(shè)計(jì),模型 Collar 中的status和模型asset中的asset_status似乎有點(diǎn)沖突。

2017年2月27日 00:49