DRF: Обновление модели в другом сериализаторе моделей или представлении
Итак, у меня есть модель User и schools, которые связаны как Owens(ManyToMany), student и staff, если владелец регистрируется и создает школу, я хотел бы выполнить частичное обновление поля Owens в request.user с null/blank или ранее созданных школ до добавления вновь созданной школы
модель пользователя
class User(AbstractBaseUser, PermissionsMixin):
class SEX(models.TextChoices):
MALE = "MALE", "Male"
FEMALE = "FEMALE", "Female"
class TYPES(models.TextChoices):
OWNER = "OWNER", "Owner"
PARTNER = "PARTNER", "Partner"
STUDENT = "STUDENT", "Student"
STAFF = "STAFF", "Staff"
TEACHER = "TEACHER", "Teacher"
DRIVER = "DRIVER", "Driver"
DIRECTOR = "DIRECTOR", "Director"
VICE_DIR = "VICE_DIR", "Vice director"
type = models.CharField(
_("User Type"), max_length=50, choices=TYPES.choices, default=None, blank=True, null=True)
sex = models.CharField(
_("Sex Type"), max_length=50, choices=SEX.choices, default=None, blank=True, null=True)
email = models.EmailField(
_("Your Email"), max_length=254, unique=True, default=None, blank=True, null=True)
student_id = models.CharField(
_("student id"), unique=True, max_length=10, blank=True, null=True)
firstname = models.CharField(max_length=250, blank=False, null=True)
middlename = models.CharField(max_length=250, blank=True, null=True)
lastname = models.CharField(max_length=250, blank=False, null=True)
# grade = models.ForeignKey(Grade, verbose_name=_(
# "grade"), on_delete=models.CASCADE, blank=True, null=True)
room = models.ForeignKey(Class, verbose_name=_(
"class"), on_delete=models.CASCADE, blank=True, null=True)
phone = models.CharField(
_("phone number"), max_length=13, blank=True, null=True)
age = IntegerRangeField(min_value=1, max_value=99,
default=25, blank=True, null=True)
owens = models.ManyToManyField(School, verbose_name=_(
"School_owner"), related_name='Schoolowner', blank=True)
serializers.py
class SchoolSerializerBase(serializers.ModelSerializer):
...
class Meta:
model = School
fields = ...
def validate(self, attrs):
...
return attrs
def create(self, validated_data):
instance = School.objects.create(
...
)
instance.save()
return instance
и у меня есть простой вид для этого
class CreateSchoolView(generics.CreateAPIView):
queryset = School.objects.all()
permission_classes = [IsSchoolOwner, ]
serializer_class = SchoolSerializerBase
Мой вопрос: как мне обновить поле request.user.ownes и добавить в него экземпляр школы?
Вы можете получить этот результат, переопределив .create() в вашем сериализаторе
В вашем сериализаторе
def create(self, validated_data):
instance = super().create(validated_data) # this is the school
# you then create the entry for your User+School
# example
user = self.context['request'].user
user.owens.add(instance)
return instance