Django обновление или создание - предварительное сохранение
Я пытаюсь решить, возможно, простую проблему. Я пытаюсь создать запись или обновить уже существующую запись. Я пытаюсь переопределить функцию сохранения модели. Критерии основаны на том, есть ли пользователь, у которого уже есть ответ для его exp_type. Я хочу обновить его, если да, если нет, то создать его.
Вот что у меня есть:
class UserExperienceTypeAnswer(TimeStampedModel):
NA, NONE, SOME, LOTS, EXPERT = range(5)
ANSWER_CHOICES = {
(NA, "Not interested"),
(NONE, "None"),
(SOME, "Some"),
(LOTS, "Lots"),
(EXPERT, "Expert"),
}
user = models.ForeignKey(User, models.CASCADE, null=False, blank=False)
exp_type = models.ForeignKey(
RecruitmentExperienceType, models.CASCADE, null=False, blank=False
)
answer = models.PositiveSmallIntegerField(
choices=ANSWER_CHOICES, default=NONE, blank=False, null=False
)
unique_together = ["user", "exp_type"]
def save(self, *args, **kwargs):
record = UserExperienceTypeAnswer.objects.filter(
user=self.user, exp_type=self.exp_type
).first()
if not record:
super(UserExperienceTypeAnswer, self).save(*args, **kwargs)
else:
//This is the part im unsure of. I tried to save the record from query above
record.answer = self.answer
super(UserExperienceTypeAnswer, record).save(*args, **kwargs)
// This gives duplicate key error (which i assume is because its trying to create new record)
// I also tried to create model directly but this creates recursion error (as i assume i am calling this method on save in infinate loop.
UserExperienceTypeAnswer.objects.create(
user=self.user, exp_type=self.exp_type, answer=self.answer
)
По предложению Christophes, я добавил это в viewset, как показано ниже. Это представление DRF, поэтому я использовал функцию create.
class UserExperienceTypeAnswerViewset(viewsets.ModelViewSet):
queryset = models.UserExperienceTypeAnswer.objects.all().order_by("id")
serializer_class = serializers.UserExperienceTypeAnswerSerializer
filterset_fields = {
"id": ("exact",),
"user": ("exact",),
}
def create(self, request, *args, **kwargs):
record = models.UserExperienceTypeAnswer.objects.filter(
user=request.data["user"], exp_type=request.data["exp_type"]
).first()
if not record:
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
else:
record.answer = request.data["answer"]
record.save()
serializer = self.get_serializer(record)
return Response(serializer.data, status=status.HTTP_201_CREATED)