【问题标题】:how to retrieve list of model from another model that has a ForeignKey relationship如何从具有 ForeignKey 关系的另一个模型中检索模型列表
【发布时间】:2019-12-17 13:58:01
【问题描述】:

我是一名初级开发人员,负责构建一个为每位员工节省资产的应用程序

员工可以拥有很多资产

员工只能查看自己的资产清单

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()

我对人际关系感到困惑,这是正确的吗?

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

【问题讨论】:

    标签: django python-2.7 api


    【解决方案1】:

    Asset 一个与Employee 的ForeignKey 关系?然后,默认情况下,员工的资产引用为Employee.asset_set.all()

    如果一个 Asset 可以有很多员工,而 Employee 也可以有很多资产,那么它是 ManyToMany 关系而不是 ForeignKey。

    阻止一名员工查看其他员工的资产是限制查看的问题。我想资产列表视图将检索链接到当前登录用户的员工,如果这就是用户模型的话。

    【讨论】:

    • 给 Asset 一个 ForeignKey 与 Employee 的关系 ----> 添加新资产时,我不想添加员工
    • 这通常通过将 ForeignKey 设为 null=True 来处理。然后,您可以在没有任何员工的情况下保存它,直到您准备好将其交给某人。也可能 on_delete=models.SET_NULL 所以当员工离开组织时它不会消失。
    • 感谢它有效,但我不明白如何使用此 Employee.asset_set.all() 为员工获取资产列表
    • 它返回与员工实例相关的Asset 对象:将其与实例一起使用,而不是与类一起使用。 e = Employee.objects.get(...) 然后例如 for asset in e.asset_set.all():
    • view.py class EmployeeDataView(RetrieveAPIView): queryset = Employee.objects.all() serializer_class= EmployeeDataSerializer lookup_field = 'id' lookup_url_kwarg = 'employee_id'
    【解决方案2】:

    听起来你现在并没有真正掌握模型关系,或者具体来说你的模型应该如何相关。您是否尝试过创建关系图的形式? IE。显示对象之间的线条的绘图(您可以只在纸上进行此操作)。 (例如,您可以查看UML class diagrams

    无论如何,您要设置的是这样的:

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

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

    【讨论】:

    • 是的,每个资产只能属于 1 名员工,我输入 ForeignKey(Employee, on_delete=models.SET_NULL)) 它可以工作。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2015-04-12
    • 2011-04-01
    • 2018-08-08
    • 2017-09-28
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    相关资源
    最近更新 更多