django 外键model的互相读取

关系模型如下:

class asset(models.Model):  
   asset_status = models.IntegerField(verbose_name=u'资产状态', choices=ASSET_STATUS, default=0)
    name = models.CharField(verbose_name=u'资产名称', max_length=32)  
   def __str__(self):              
       return self.name
       
class People(models.Model):
    number = models.CharField(u'员工编号', 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='手机号')
    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"领用人")
    asset = models.ForeignKey(Asset, verbose_name=u'资产', null=True)
    collar_time = models.DateField(verbose_name=u"领用时间", )
    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'资产领用'
        verbose_name_plural = u'资产领用'

上面的数据关系很明晰,Collar中有people和Asset的外键,那么我想在asset的详细页里面看到people是哪个该怎么操作呢?

我通过下面获取到了所有的信息,需要怎么样的过滤呢?

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

这样就把所有的信息都给整出来了,有没有办法做到精确到哪个人领到的资产,就显示出哪个people到信息呢?

阅读 3.2k
2 个回答

哈哈~我这算是跟踪了。表格设计是挺清晰。
上面的for循环只会得到最后一个循环的结果,因此,你并不是获得了所有的 people 或者 asset。
如果一定要用for的方式做。那么你在for循环外层要加一个列表或者字典来存放你for循环得到的每一条数据,之后在模板中又一次for循环得到每个子数据。(有点多余哈)
所以,建议你看看Django中数据库操作反向查询那块。下面的内容也许就是实现你想法的方法。
asset_item = asset.objects.get(pk=1)
collar_asset = asset_item.asset_set.all() #查询集,这个时候不能直接get,因为是查询集
first = collar_asset.first() #得到你第一条对应上的领用数据
first.people #这个时候你才能得到你的领用人信息。
那么问题来了,看你的设计本来应该是一个领用记录就对应一个资产的,再从当前某一资产上找到对应的领用人信息。
但实际上:一个资产是有可能被重复领用的(不同时间)。所以,上面三个表格的设计可能并不是你想要的。

仔细看了一下上面三张表格的设计,模型 Collar 中的status和模型asset中的asset_status似乎有点冲突。

  1. 你的people,asset在Collar的关系是多对多,asset与collar的关系是一对多

  2. 通过asset查向collar

collar_set = asset.collar_set.all()// 有多个
  1. 再向collar_set查向people

for collar in collar_set:
    collar.people

最后,建议在ForeignKey上添加relate_name来帮助反向查询,要不就只能用默认的查询名字
django文档

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题