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
Вернуться на верх