【问题标题】:Query to get data in particular format in Django在 Django 中查询以获取特定格式的数据
【发布时间】:2020-05-08 19:48:50
【问题描述】:

我的模特:

class Student(models.Model):
    name = models.CharField(max_length=100)
    email = models.CharField(max_length=100, unique=True)
    password = models.CharField(max_length=25)


class Subject(models.Model):
    name = models.CharField(max_length=100)


class Student_subject_mapping(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE)

我正在尝试以以下格式获取数据库中的所有Student_subject_mapping 数据:

以下列方式获取数据的查询是什么? 如何实现上述格式的数据?

我的看法:

class Get_Students(APIView):

    def get(self, request):

        try:
            res = StudentSerializer(Student.objects.all(), many=True).data
            print({"results": res})
            return Response({"results": res}, status=status.HTTP_200_OK)

【问题讨论】:

    标签: python django python-3.x django-rest-framework django-views


    【解决方案1】:

    models.py

    class Student(models.Model):
        name = models.CharField(max_length=100)
        email = models.CharField(max_length=100, unique=True)
        password = models.CharField(max_length=25)
    
    class Subject(models.Model):
        name = models.CharField(max_length=100)
    
    
    class Student_subject_mapping(models.Model):
        student = models.ForeignKey(Student, on_delete=models.CASCADE, related_name='subjects')
        subject = models.ForeignKey(Subject, on_delete=models.CASCADE)
    

    序列化器.py


    class StudentSubjectMappingSerializer(serializers.ModelSerializer):
        id = serializers.SerializerMethodField()
        name = serializers.SerializerMethodField()
    
        def get_id(self, obj):
            return obj.subject.id
    
        def get_name(self, obj):
            return obj.subject.name
    
        class Meta:
            model = Student_subject_mapping
            fields = ['id', 'name']
    
    class StudentSerializer(serializers.ModelSerializer):
        subjects = serializers.SerializerMethodField()
    
        def get_subjects(self, obj):
            return StudentSubjectMappingSerializer(obj.subjects.all(), many=True).data
    
        class Meta:
            model = Student
            fields = ['id', 'email', 'subjects']
    

    您的查询

    subjects = StudentSerializer(Student.objects.all(), many=True).data
    
    
    print(json.dump({"results" : subjects}))
    

    另外你不必为映射创建不同的表,你可以使用models.ManyToMantField例子

    class Student(models.Model):
        name = models.CharField(max_length=100)
        email = models.CharField(max_length=100, unique=True)
        password = models.CharField(max_length=25)
        subjects = models.ManyToManyField(Subject)
    
    class Subject(models.Model):
        name = models.CharField(max_length=100)
    

    上述模型结构的序列化器

    class SubjectSerializer(serializers.ModelSerializer):
        class Meta:
            model = Subject
            fields = ['id', 'name']
    
    class StudentSerializer(serializers.ModelSerializer):
        subjects = serializers.SerializerMethodField()
    
        def get_subjects(self, obj):
            return SubjectSerializer(obj.subjects.all(), many=True).data
    
        class Meta:
            model = Student
            fields = ['id', 'email', 'subjects']
    

    【讨论】:

    • 嗨,Jeet,感谢您的回复,但我收到了“StudentSerializer(”的回复格式。@Jeet
    • @Zodiac 我的错。我忘了写.data 来获取序列化数据。我已经更新了我的答案,它现在应该可以工作了。立即尝试!
    • No @Jeet 我收到一个错误:尝试在序列化程序 SubjectSerializer 上获取字段 name 的值时出现 AttributeError。\n序列化程序字段可能命名不正确并且与任何属性不匹配或Student_subject_mapping 实例上的键。\n原始异常文本是:'Student_subject_mapping' 对象没有属性 'name'。"
    • 你能发布你的views.py吗?
    • 是的,发布!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2017-10-09
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    相关资源
    最近更新 更多