Django 如何使用字典字段对嵌套序列化程序执行修补程序操作
我有一个dictionary对象模型,在下面的示例中,我想设置并获取每日可用性示例 目前我能够阅读,想让它读和写,我应该为此做些什么Django 如何使用字典字段对嵌套序列化程序执行修补程序操作,django,python-3.x,django-models,django-rest-framework,django-views,Django,Python 3.x,Django Models,Django Rest Framework,Django Views,我有一个dictionary对象模型,在下面的示例中,我想设置并获取每日可用性示例 目前我能够阅读,想让它读和写,我应该为此做些什么 "teacher_date": [ { "day_available": "MON", "time_available": "Morning" }, { "day_available
"teacher_date": [
{
"day_available": "MON",
"time_available": "Morning"
},
{
"day_available": "SAT",
"time_available": "Afternoon"
},
{
"day_available": "SUN",
"time_available": "Evening"
}
这是我的模特
class Availability(models.Model):
uid = models.AutoField(verbose_name='ID',
serialize=False,
auto_created=True,
primary_key=True)
MONDAY = 'MON'
TUESDAY = 'TUE'
WEDNESDAY = "WED"
THURSDAY = "THU"
FRIDAY = 'FRI'
SATURDAY = "SAT"
SUNDAY = "SUN"
DAY = (
(MONDAY, 'Monday'),
(TUESDAY, 'Tuesday'),
(WEDNESDAY, 'Wednesday'),
(THURSDAY, 'Thursday'),
(FRIDAY, 'Friday'),
(SATURDAY, 'Saturday'),
(SUNDAY, 'Sunday'),
)
day_available = models.CharField(
max_length=3, choices=DAY, default=MONDAY)
MORNING = 'Morning'
NOON = 'AfterNoon'
EVENING = 'Evening'
TIME = (
(MORNING, 'Morning'),
(NOON, 'Afternoon'),
(EVENING, 'Evening'),
)
time_available = models.CharField(
max_length=30, choices=TIME, default=MORNING)
def __str__(self):
return f"{self.day_available} {self.time_available}"
这是我的serializer.py文件
class AvailabilityDetails(serializers.ModelSerializer):
class Meta:
model = Availability
fields = ('day_available', 'time_available',)
class TeacherProfileDetails(serializers.ModelSerializer):
logger = logging.getLogger(__name__)
teacher_date = AvailabilityDetails(many=True, read_only=True)
first_name = serializers.CharField(source='user.first_name', read_only=True)
last_name = serializers.CharField(source='user.last_name', read_only=True)
cities = serializers.SlugRelatedField(many=True, slug_field='city', queryset=City.objects.all(),)
subject = serializers.SlugRelatedField(many=True, slug_field='subject', queryset=Subject.objects.all(),)
teacher_date = AvailabilityDetails(many=True, read_only=True)
user = UserDetailsSerializer(read_only=True)
class Meta:
model = Teacher
fields = ('user', 'first_name', 'last_name',
'bio', 'teacher_cost', 'subject', 'teacher_date', 'cities')
def get_subject(self, obj):
subject_list = []
for i in obj.subject.all():
subject_list.append(i.subject)
return subject_list
在教师日期应该执行什么样的序列化才能执行写操作?问题在于您定义序列化程序的方式 您已将
teacher\u date
定义为只读字段。因此,在PUT/POST调用中将忽略此字段
teacher\u date=可用性详细信息(many=True,read\u only=True)
参考此
您遇到了什么错误没有错误,在修补程序操作过程中没有更新教师日期,只获取工作显示更新代码,然后在主帖子上添加views.py您想做什么?我尝试删除read_only=True,然后获取以下错误`AssertionError:
.update()
方法默认情况下不支持可写嵌套字段。为序列化程序API.serializer.TeacherProfileDetails编写一个显式的.update()
方法,或者在嵌套的序列化程序字段上设置只读=True
`根据您的用例,下面的文章提供了两种解决方案。你可以和他们中的任何一个一起去。我的用例与您上面提到的不同,我在每个分支``“教师日期”:[{“日期可用”:“周一”,“时间可用”:“上午”},{“日期可用”:“周六”,“时间可用”:“下午”},{“day\u available”:“SUN”,“time\u available”:“night”}``在视图类的补丁中,使用与可用性相关的键获取可用性模型的DB对象,我假设该键存在于request.data中,然后在save()中传递该DB对象在补丁中,我可以得到teacher对象,还有,如何更新补丁方法中的一个字段?
Here is my **views.py**
class TeacherListCreateAPIView(APIView):
logger = logging.getLogger(__name__)
#def create(self, request, *args, **kwargs):
def get(self, request, *args, **kwargs):
self.logger.info("Geeting TeacherListCreateAPIView information")
teacherList = Teacher.objects.filter(user__username=kwargs["username"])
self.logger.info(teacherList)
serializers = TeacherProfileDetails(teacherList, many=True)
self.logger.info(serializers.data)
return Response(serializers.data)
def patch(self, request, *args, **kwargs):
teacher = Teacher.objects.get(user__username=kwargs['username'])
serializers = TeacherProfileDetails(data=request.data, instance=teacher)
self.logger.info(serializers)
if serializers.is_valid():
serializers.save()
return Response(serializers.data, status=status.HTTP_201_CREATED)
return Response(serializers.errors, status=status.HTTP_400_BAD_REQUEST)