如何在Django中填充特定于用户的数据

2024-05-16 07:04:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个模型,分别是employee和leave,其中EmployeeLeave中的外键。我想在特定员工登录时在页面上显示他们的请假请求。 我无法获取上填充的休假数据,如果一名员工申请了两次以上的休假,我会收到一条错误消息,指出找到了两项

这是我的密码

models.py

class Employee(models.Model):
    user=models.OneToOneField(User, on_delete=models.CASCADE)
    no_of_leaves=models.IntegerField(
        null=False,
        validators=[
            MinValueValidator(1),
            MaxValueValidator(24)
        ],
        default=24
    )

   def __str__(self):
        return self.user.username

class Leave(models.Model):
    employee=models.ForeignKey(Employee,on_delete=models.CASCADE,default="")
    start_date=models.DateField(auto_now_add=False)
    end_date=models.DateField(auto_now_add=False)
    req_date=models.DateTimeField(default=datetime.datetime.now())
    STATUS_OPTIONS = (
        ("Approve","Approve"),
        ("Pending","Pending"),
        ("Decline","Decline"),
   )
    approved=models.CharField(max_length=10,choices=STATUS_OPTIONS,default='Pending')

    def __str__(self):
        return self.employee.user.username

    @property
    def date_diff(self):
        return (self.start_date - self.end_date).days

views.py

def home(request):
    user = request.user
    u = User.objects.get(username=user)
    e = Employee.objects.get(user=user.id)
    leave = Leave.objects.get_or_create(employee=e)
    print(leave)

    nofleaves=None
    if user.is_superuser:
        pass
    else:
        nofleaves=u.employee.no_of_leaves
    context={'nofleaves':nofleaves,'leave':leave,}

    return render(request,"leaveApp/home.html",context)

Tags: selffalsedefaultdatereturnmodelsdefusername
2条回答

这个other question可能会有帮助

问题是您应该只对一个数据使用get。您不应该在多对一关系上使用get。逻辑是Employee可以有多个Leave,因此不能一致使用get

您可以使用的是filter,但我会使用related names/related fields,如果您正确定义它,它将允许您使用employee.leaves

就像@Jao所说的get只获取一个数据,而LeaveEmployee之间存在多对一关系,这意味着一名员工可以有多个假期,因此get将抛出一个错误

您应该使用filter

换行

leave = Leave.objects.get_or_create(employee=e)类似于

leave = Leave.objects.filter(employee=e.id)

if not leave.exists():
    leave = Leave.objects.create(employee=e)

相关问题 更多 >