【问题标题】:'QuerySet' object has no attribute 'pk''QuerySet' 对象没有属性 'pk'
【发布时间】:2021-06-18 11:32:38
【问题描述】:
#models
class Student(models.Model):
firstname =  models.CharField(max_length=100,default='ll')
lastname = models.CharField(max_length=100,default='fewf')
id_code = models.CharField(max_length=10,default=0,unique=True)
melli = models.CharField(max_length=30,default=0,unique=True)
personal_pic = models.ImageField(upload_to=studentFile)
major = models.ForeignKey(Major, on_delete=models.PROTECT,default=0)
date_of_start = models.DateField(default=datetime.date.today)

def __str__(self):
    return self.id_code

#views
class loginView(APIView):
def post(self, request):
    data = request.data
    melli = data.get('melli')
    id_code = data.get('id_code')
    student = Student.objects.filter(id_code=id_code,melli=melli)
    if not student.exists():
       return Response('error')
    serializer = StudentSerializer(student,data=data)
    serializer.is_valid()
    return Response(serializer.data)

当我尝试提交发布请求时,我被排除在接收响应之外,但我收到了错误。我该如何解决?

【问题讨论】:

    标签: django-rest-framework django-rest-viewsets


    【解决方案1】:

    您序列化一个元素的集合,因此您应该使用many=True

    serializer = StudentSerializer(student,data=data<b>, many=True</b>)

    如果您只想使用单个对象,则需要检索 单个 对象,而不是对象集合,例如使用 .get(…) [Django-doc] 而不是 .filter(…) [Django-doc]。 p>

    【讨论】:

    • 谢谢兄弟,这个解决了我的问题,但是因为我需要检索单个元素,我必须将许多设置为 false
    【解决方案2】:

    Model.filter 返回一个查询集,它就像一个模型列表,而不是一个特定的模型。相反,您应该使用 get,它返回单个模型实例:

    student = Student.objects.get(id_code=id_code,melli=melli)
    

    如果您打算在此特定查询中超过 1 个学生,则可以将 many=True 添加到您的序列化程序中:

    serializer = StudentSerializer(student,data=data, many=True)
    

    【讨论】:

    • hhmm,我就是这么做的; serializer = mySerializer(queryset, data=data, many=True)is_valid() 仍然返回*** AttributeError: 'QuerySet' object has no attribute 'pk'
    • 啊,to_internal_value 需要按照这里的建议修改 github.com/miki725/django-rest-framework-bulk/issues/68 在我的情况下
    猜你喜欢
    • 1970-01-01
    • 2020-10-31
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    相关资源
    最近更新 更多