值错误:无法将queryset分配给属性,它必须是实例

时间:2017-09-29 10:03:32

标签: django django-models

我有models.py

class employees(models.Model):
  emp_id=models.PositiveIntegerField()
  emp_name = models.CharField(max_length = 100)
  emp_lname = models.CharField(max_length = 100)
  emp_loc=models.CharField(max_length=5,choices=LOCATION)
  manager_id=models.ForeignKey('self',null=True,blank=True)  

class leave(models.Model): 
  employee = models.ForeignKey(employees, on_delete=models.CASCADE, default='1')
  start_date = models.DateField()
  end_date = models.DateField()
  status=models.CharField(max_length=1,choices=LEAVE_STATUS,default='P')
  ltype=models.CharField(max_length=2,choices=LEAVE_TYPE)
  message=models.CharField(max_length=500,blank=True)  

class notify(models.Model):
  sender_id=models.ForeignKey(leave, related_name='%(class)s_sendername')
  receiver_id=models.ForeignKey(leave,related_name='%(class)s_receivername')
  date_time=models.DateTimeField()

我有views.py

 def accept(request):
   approved_emp_id=leave.objects.filter(id=accept_id);
approving_emp_id=leave.objects.filter(employee__emp_id=request.user.username);
accept_notify=notify(sender_id=approving_emp_id,  receiver_id=approved_emp_id,date_time=datetime.datetime.now(),viewed='N');
accept_notify.save()

当我想将值保存到数据库时,我收到错误为ValueError: Cannot assign "<QuerySet [<leave: 121-geeta-2017-10-04-2017-10-06-C-V-2017-09-27 07:48:36.288873+00:00>]>": "notify.sender_id" must be a "leave" instance.

我错在哪里approving_emp_idapproved_emp_id都只是离开实例。

1 个答案:

答案 0 :(得分:1)

当参数应该是实例时,您正在传递QuerySetQuerySet是实例列表。只传递一个实例。使用leave.objects.get()代替leave.objects.filter()

objects.get()返回objects.filter()返回QuerySet的单个实例。

def accept(request):
    approved_emp_id = leave.objects.get(id = accept_id)
    approving_emp_id = leave.objects.get(employee__emp_id = request.user.username)
    accept_notify = notify(sender_id = approving_emp_id, receiver_id = approved_emp_id, date_time = datetime.datetime.now(), viewed = 'N')
    accept_notify.save()

另一种方式是slicing QuerySet

def accept(request):
    approved_emp_id = leave.objects.filter(id = accept_id)[0]
    approving_emp_id = leave.objects.filter(employee__emp_id = request.user.username)[0]
    accept_notify = notify(sender_id = approving_emp_id, receiver_id = approved_emp_id, date_time = datetime.datetime.now(), viewed = 'N')
    accept_notify.save()