序列化多个相关模型

时间:2019-11-26 12:54:59

标签: django-models django-rest-framework django-views drf-queryset

我正在学习Django和休息框架。

我有三个模型:User,UserHospital和Timeslots。用户正在安排医院的时间表。我要求用户提供有关医院的所有详细信息,这些信息应显示医院详细信息以及时间段。想要以以下格式表示用户详细信息。

我的代码有什么问题? 使用视图集和序列化程序是可能的,还是我不得不尝试另一种方法?

{
    "first_name": "abc",
    "last_name": "xyz",
    "mobile_number":1111111111,
    "related_hospitals": [{
                            "id": 1,
                            "name": "bbbb"
                            "timeslot": [
                {
                    "day": "TUE",
                    "start_time": "09:00:00",
                    "end_time": "15:00:00"
                },
                {
                    "day": "WED",
                    "start_time": "10:00:00",
                    "end_time": "20:00:00"
                }
            ]


                        },
                        {
                         "id": 2,
                        "name": "ccc"
                        "timeslot": []
                        }]

}

创建的模型如下:

class Users(models.Model):

    mobile_number = models.BigIntegerField()
    first_name = models.CharField(max_length=255, null=True)
    last_name = models.CharField(max_length=255, null=True)

class TimeSlots(BaseAbstract):

    DAYS = (
        ('SUN', 'sunday'),
        ('MON', 'Monday'),
        ('TUE', 'tuesday'),
        ('WED', 'wednesday'),
        ('THU', 'thursday'),
        ('FRI', 'friday'),
        ('SAT', 'saturday'),

    )

    STATUS = (
        (1, 'HOLIDAY'),
        (2, 'ON_LEAVE'),
        (3, 'AVAILABLE'),
        (4, 'NOT_AVAILABLE')
    )

    DEFAULT_STATUS = 3

    DEFAULT_DAY = "SUN"

    day = models.CharField(default=DEFAULT_DAY, choices=DAYS, max_length=20)
    start_time = models.TimeField()
    end_time = models.TimeField()
    status = models.SmallIntegerField(default=DEFAULT_STATUS, choices=STATUS)

class UserHospital(BaseAbstract):

    user = models.ForeignKey('users.Users', on_delete=models.SET_NULL, null=True)
    name = models.(Hospital,CharField(max_length=255, null=True)
    timeslots = models.ManyToManyField(TimeSlots)

我尝试过:

class TimeslotSerializer(serializers.ModelSerializer):
    class Meta:
        model = TimeSlots
        fields = ('day', 'start_time', 'end_time')
        read_only_fields = ('id',)


class RelatedHospitalSerializer(serializers.ModelSerializer):
    timeslot = TimeslotSerializer(many=True)

    class Meta:
        model = UserHospital
        fields = ('name', 'timeslot')
        read_only_fields = ('id',)


class UserDetailsSerializer(serializers.ModelSerializer):
    related_hospitals = serializers.SerializerMethodField()

    def get_related_hospitals(self, obj):
        hospitalData = []
        if UserHospital.objects.all().filter(user=obj).exists():
            hospitalData = UserHospital.objects.all().filter(user=obj)
        return RelatedHospitalSerializer(hospitalData).data

    class Meta:
        model = Users
        fields = ('first_name', 'last_name','mobile_number','related_hospitals')
        read_only_fields = ('id', 'related_hospitals')


class UserDetailsViewset(mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
    queryset = Users.objects.all()
    serializer_class = UserDetailsSerializer    

    def get_queryset(self):

        userid = self.request.query_params.get('userid')
        if userid is not None:
            userData = Users.objects.filter(user=userid)
            return userData
        else:
            return Users.objects.all()

我的代码有什么问题?

1 个答案:

答案 0 :(得分:0)

我建议使用models.ForeignKey,.. ManytoMany字段等的related_name参数 例如,

def Hospital(models.Model):
     user = models.ForeignKey(....., related_name="hospitals")
     ...

def HospitalSerializer(models.Model):
      ...

def UserSerializer(Hyperlinkedmodelserializer ...(or other):
     hospitals = HospitalSerializer(many=True)
     class Meta:
         ....

注意:“医院”的使用....

这将自动允许一个人获得

的结果
UserSerializer(userModel, context={'request':request}).data ... 

以您想要的格式