如何从具有外键关系的另一个模型中检索模型列表

时间:2019-12-17 13:58:01

标签: django python-2.7 api

我是一名初级开发人员,负责构建一个将资产保存到每个员工的应用程序

员工可以拥有很多资产

员工只能看到自己的资产列表

class Category(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name


class Asset(models.Model):
    name = models.CharField(max_length=50)
    # added_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='asset_added_by')
    description = models.TextField()
    categories = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='asset_categories')
    image = models.ImageField(upload_to='asset_images', null=True, blank=True)
    stock =models.IntegerField()

    def __str__(self):
        return self.name


class Department(models.Model):
    name = models.CharField(max_length=50)
    number_of_employees = models.IntegerField()

    def __str__(self):
        return self.name    


class Employee(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE,)
    department = models.ForeignKey(Department, on_delete=models.CASCADE,)
    image = models.ImageField(upload_to='employee_image', null=True, blank=True)
    def __str__(self):
        return self.user.username   

class Registration(models.Model):
    employees = models.ForeignKey(Employee, on_delete=models.CASCADE,)
    assets = models.ForeignKey(Asset, on_delete=models.CASCADE,)
    date_from = models.DateField()
    date_to = models.DateField()

我对人际关系感到困惑吗?

如何获取每个员工的资产清单?

2 个答案:

答案 0 :(得分:0)

授予AssetEmployee的ForeignKey关系?然后,默认情况下,员工的资产被引用为Employee.asset_set.all()

如果资产既可以有很多员工,也可以有很多资产,那么它的ManyToMany关系就不是ForeignKey。

让一个员工看不到另一名员工的资产只是限制视图的问题。我可以想象,如果这是用户模型,那么资产列表视图将检索链接到当前登录用户的Employee。

答案 1 :(得分:0)

听起来像现在您还没有真正掌握模型关系,或者确切地说您应该如何关联模型。您是否尝试过创建关系图的形式?即显示对象之间线条的图形(您可以在纸上完成此操作)。 (例如,您可以研究chromedriver download page

无论如何,您要设置的内容如下:

User  -<-  Employee  ->  Department
               |    
               ^
               |
Category -<- Asset

我在这里假设每个资产只能属于1名员工。如果确实是您想要的,则Nigel222所说的几乎是正确的,尽管您应将关系写在资产对象上(employee=models.ForeignKey(Employee, on_delete=models.CASCASDE))。 如果不是这种情况,则应改为添加ManyToManyField。 assets = models.ManyToManyField(Asset, on_delete=models.CASCADE)