Django-nester序列化对象上的更新操作(多对多)
我想更新nester序列化程序字段,下面的示例我想更新字段teacher\u date 这是我的数据补丁Django-nester序列化对象上的更新操作(多对多),django,django-models,django-rest-framework,django-views,django-serializer,Django,Django Models,Django Rest Framework,Django Views,Django Serializer,我想更新nester序列化程序字段,下面的示例我想更新字段teacher\u date 这是我的数据补丁 { "user": { "pk": 2, "username": "rayees", "email": "rayees.xxxx@xxxx.co.in", "first_name": "Rayees", "last_name": "xxxxx",
{
"user": {
"pk": 2,
"username": "rayees",
"email": "rayees.xxxx@xxxx.co.in",
"first_name": "Rayees",
"last_name": "xxxxx",
"user_type": "Teacher"
},
"first_name": "Rayees",
"last_name": "xxxx",
"bio": "TEST BIO",
"teacher_cost": "22.00",
"subject": [
"HINDI",
"ENGLISH"
],
"teacher_date": [
{
"day_available": "MON",
"time_available": "Morning"
},
{
"day_available": "SUN",
"time_available": "Morning"
}
],
"cities": [
"SANTA CLARA",
"SUNNYVALE"
]
}
在本例中,除教师日期外,所有内容都会更新
Model.py
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}"
class Teacher(models.Model):
uid = models.AutoField(verbose_name='ID',
serialize=False,
auto_created=True,
primary_key=True)
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField(null=True, blank=True)
teacher_cost = models.DecimalField(
max_digits=5, decimal_places=2, null=True, blank=True)
languages = models.CharField(
max_length=50, null=True, blank=True)
subject = models.ManyToManyField('Subject')
teacher_date = models.ManyToManyField(Availability)
cities = models.ManyToManyField('City', related_name='teacher')
def __str__(self):
return self.user.username
序列化程序.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)
user = UserDetailsSerializer(read_only=True)
class Meta:
model = Teacher
fields = ('user', 'first_name', 'last_name',
'bio', 'teacher_cost', 'subject', 'teacher_date', 'cities')
def update(self, instance, validated_data):
self.logger.info("-------- Inside the update --------------")
teacher_date = validated_data.pop('teacher_date')
self.logger.info(teacher_date)
teacher_date = instance
teacher_date.__dict__.update(validated_data)
teacher_date.save()
return teacher_date
在这里,我在序列化中犯了一些错误,对于teacher_date,在修补程序操作期间调用了update方法,但是新添加的值在DB中没有得到更新,您需要循环检查teacher_date的已验证数据,首先保存它,然后添加到teacher实例。这就是多对多现场作业的数量 TeacherProfileDetails中的实例不是可用的教师
def更新(自身、实例、已验证的_数据):
self.logger.info(“----------在更新中-----------------”)
#你需要其他代码吗
教师日期=已验证的教师数据.pop('teacher\u date')
如果教师指定日期:
#第一,明确现有关系
instance.teacher\u date.clear()
对于教师日期中的日期:
可用性=可用性。对象。创建(**日期)
实例.teacher\u date.add(可用性)
#你需要其他代码吗
返回日期
您需要循环检查教师日期的已验证数据,并首先将其保存,然后添加到教师实例中。这就是多对多现场作业的数量
TeacherProfileDetails中的实例不是可用的教师
def更新(自身、实例、已验证的_数据):
self.logger.info(“----------在更新中-----------------”)
#你需要其他代码吗
教师日期=已验证的教师数据.pop('teacher\u date')
如果教师指定日期:
#第一,明确现有关系
instance.teacher\u date.clear()
对于教师日期中的日期:
可用性=可用性。对象。创建(**日期)
实例.teacher\u date.add(可用性)
#你需要其他代码吗
返回日期
我认为该代码将删除所有内容并仅保留教师日期,我还需要更新其他一些字段,通过此更改,我得到了错误'list'对象没有属性'subject'
我认为该代码将删除所有内容并仅保留教师日期,我还需要更新其他一些字段,通过此更改,我得到一个错误“list”对象没有属性“subject”