Drf: Обновление или создание экземпляра модели
У меня есть модель посещаемости, которая имеет уникальное ограничение вместе для даты и пользовательского поля fk, прямо сейчас моя импликация createorupdate - это if else, что выглядит некрасиво
def create(self, validated_data):
user = validated_data.get('user', None)
date = validated_data.get('date', None)
if date is not None:
user = Attendance.objects.filter(user=user, date=date).first()
if user is not None:
instance = Attendance.objects.update(
user=validated_data['user'],
presence=validated_data['presence'],
leave_reason=validated_data['leave_reason'],
date=validated_data['date'],
)
return instance
else:
instance = Attendance.objects.create(
user=validated_data['user'],
presence=validated_data['presence'],
leave_reason=validated_data['leave_reason'],
date=validated_data['date'],
)
return instance
это работает, единственная проблема в том, что возвращаемый объект после обновления является нулевым для всех полей, и мне нужен лучший пример имплиментации
полный сериализатор:
class AttendanceSerializer(serializers.ModelSerializer):
date = serializers.HiddenField(default=timezone.now)
leave_reason = serializers.CharField(required=False, default="")
class Meta:
model = Attendance
fields = ['user', 'presence', 'leave_reason', 'date'] #all the fields except pk
extra_kwargs = {
'user': {'required': True},
'presence': {'required': True},
'leave_reason': {'required': False},
}
# validators = [
# UniqueForYearValidator(
# queryset=Attendance.objects.all(),
# field='user',
# date_field='date',
# message=("You have already taken the attendance")
# )
# ]
def create(self, validated_data):
user = validated_data.get('user', None)
date = validated_data.get('date', None)
if date is not None:
user = Attendance.objects.filter(user=user, date=date).first()
if user is not None:
instance = Attendance.objects.update(
user=validated_data['user'],
presence=validated_data['presence'],
leave_reason=validated_data['leave_reason'],
date=validated_data['date'],
)
return instance
else:
instance = Attendance.objects.create(
user=validated_data['user'],
presence=validated_data['presence'],
leave_reason=validated_data['leave_reason'],
date=validated_data['date'],
)
return instance
Я знаком только с .update() после Attendace.objects.filter(), но не после Attendance.objects. Может быть, попробуйте так:
def create(self, validated_data):
user = validated_data.get('user', None)
date = validated_data.get('date', None)
if date is not None:
user_var = Attendance.objects.filter(user=user, date=date).first()
if user is not None:
instance = user_var.update(
user=validated_data['user'],
presence=validated_data['presence'],
leave_reason=validated_data['leave_reason'],
date=validated_data['date'],
)
return instance
else:
instance = Attendance.objects.create(
user=validated_data['user'],
presence=validated_data['presence'],
leave_reason=validated_data['leave_reason'],
date=validated_data['date'],
)
return instance