首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取外键表drf django的所有值

获取外键表drf django的所有值
EN

Stack Overflow用户
提问于 2020-03-23 06:08:41
回答 1查看 101关注 0票数 0

我有这张桌子。我想从学校拿到所有教师表的字段。当前它获取指向教师密钥的名称和员工字段。

代码语言:javascript
复制
class Teacher(models.Model):
      name = models.CharField(max_length=100)
      key = models.CharField(max_length=50,unique=True)
      value = models.CharField(max_length=50)
      def __str__(self):
          return self.name


class School(models.Model):
      name= models.CharField(max_length=100)
      employee = models.ForeignKey(Teacher, to_field="key",on_delete=models.CASCADE)

     def __str__(self):
         return self.name

serializers.py:

代码语言:javascript
复制
class TeacherSerializer(serializers.ModelSerializer):
     class Meta:
          model = Teacher
          fields = ('name','key','value')




class SchoolSerializer(serializers.ModelSerializer):
     teacher = TeacherSerializer(many=True, read_only=True)

    class Meta:
        model = School
        fields = ('name','employee','teacher')

views.py:

代码语言:javascript
复制
@api_view(['GET'])
def SchoolList(APIView):
    queryset = School.objects.all().values('name','employee','employee__value')
    asd=[]
    for sdf in queryset:
        asd.append(sdf)
    serialized_obj = SchoolSerializer(queryset,many=True)
    return HttpResponse(json.dumps(serialized_obj.data))

回溯:

代码语言:javascript
复制
  traceback (most recent call last):
  File "/home/tboss/Desktop/environment/tryme/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
  response = get_response(request)
  File "/home/tboss/Desktop/environment/tryme/venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
  response = self.process_exception_by_middleware(e, request)
  File "/home/tboss/Desktop/environment/tryme/venv/lib/python3.7/site-packages/django  /core/handlers/base.py", line 113, in _get_response
  response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/tboss/Desktop/environment/tryme/venv/lib/python3.7/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
  return view_func(*args, **kwargs)
  File "/home/tboss/Desktop/environment/tryme/venv/lib/python3.7/site-packages/django/views/generic/base.py", line 71, in view
  return self.dispatch(request, *args, **kwargs)
  File "/home/tboss/Desktop/environment/tryme/venv/lib/python3.7/site-packages/rest_framework/views.py", line 505, in dispatch
   response = self.handle_exception(exc)
  File "/home/tboss/Desktop/environment/tryme/venv/lib/python3.7/site-packages/rest_framework/views.py", line 465, in handle_exception
  self.raise_uncaught_exception(exc)
  File "/home/tboss/Desktop/environment/tryme/venv/lib/python3.7/site-packages/rest_framework/views.py", line 476, in raise_uncaught_exception
raise exc
  File "/home/tboss/Desktop/environment/tryme/venv/lib/python3.7/site-packages/rest_framework/views.py", line 502, in dispatch
  response = handler(request, *args, **kwargs)
  File "/home/tboss/Desktop/environment/tryme/venv/lib/python3.7/site-packages/rest_framework/decorators.py", line 50, in handler
return func(*args, **kwargs)
  File "/home/tboss/Desktop/environment/tryme/gama/main/views.py", line 20, in SchoolList
return HttpResponse(json.dumps(serialized_obj.data))
  File "/home/tboss/Desktop/environment/tryme/venv/lib/python3.7/site-packages/rest_framework/serializers.py", line 760, in data
ret = super().data
  File "/home/tboss/Desktop/environment/tryme/venv/lib/python3.7/site-packages/rest_framework/serializers.py", line 260, in data
self._data = self.to_representation(self.instance)
  File "/home/tboss/Desktop/environment/tryme/venv/lib/python3.7/site-packages/rest_framework/serializers.py", line 678, in to_representation
self.child.to_representation(item) for item in iterable
  File "/home/tboss/Desktop/environment/tryme/venv/lib/python3.7/site-packages/rest_framework/serializers.py", line 678, in <listcomp>
self.child.to_representation(item) for item in iterable
  File "/home/tboss/Desktop/environment/tryme/venv/lib/python3.7/site-packages/rest_framework/serializers.py", line 529, in to_representation
  ret[field.field_name] = field.to_representation(attribute)
  File "/home/tboss/Desktop/environment/tryme/venv/lib/python3.7/site-packages/rest_framework/relations.py", line 460, in to_representation
  return getattr(obj, self.slug_field)

AttributeError:'str‘对象没有属性'key’

输出:获取每个教师领域中的所有教师字段。

代码语言:javascript
复制
[{"name": "teacher", "employee": "subject", "teachers": [{"name": "pappu", "key": "subject", "value": "math"}, {"name":
"monu", "key": "another_subject", "value": "english"}]}, {"name": "teacher1", "employee": "another_subject", "teachers": [{"name": "pappu",
"key": "subject", "value": "math"}, {"name": "monu", "key": "another_subject", "value": "english"}]}]

我期待着这样:

代码语言:javascript
复制
[{"name": "teacher", "employee": "subject", "teachers": [{"name": "pappu", "key": "subject", "value": "math"}]}, {"name": "teacher1", "employee": "another_subject", "teachers": [{"name": "monu", "key": "another_subject", "value": "english"}]}]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-23 06:14:34

我觉得你的模型设计错了。教师应该有一个字段名employee,它指向School,如下所示:

代码语言:javascript
复制
class Teacher(models.Model):
      name = models.CharField(max_length=100)
      key = models.CharField(max_length=50,unique=True)  
      value = models.CharField(max_length=50)
      employee = models.ForeignKey(School, on_delete=CASCADE, related_name='teachers')

然后从学校到教师模型进行逆向查询,得到所有的教师。如下所示:

代码语言:javascript
复制
class SchoolSerializer(serializers.ModelSerializer):
     teachers = TeacherSerializer(many=True, read_only=True)  # using teachers due to `related_name` defined in employee field inside Teacher model

    class Meta:
        model = School
        fields = ('name','teachers')

假设你的模型是正确的

然后简单地使用:

代码语言:javascript
复制
class SchoolSerializer(serializers.ModelSerializer):
     employee = TeacherSerializer(read_only=True)

     class Meta:
        model = School
        fields = ('name', 'employee')

更新视图

我认为最好这样更新你的观点:

代码语言:javascript
复制
from rest_framework.response import Response

@api_view(['GET'])
def SchoolList(APIView):
    serialized_obj = SchoolSerializer(School.objects.all(),many=True)
    return Response(serialized_obj.data)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60808656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档