После отправки сообщения или запроса обновления я получаю 1062, "Duplicate entry '' for key 'crmapp_employees.email'". [Внешний ключ]
Концепция заключается в том, что я пытаюсь опубликовать или обновить Дело. Поля "title", "customer", "assigned_to" и "created_by" являются обязательными. Также "assigned_to" и "created_by" являются внешними ключами модели Employees с полем email как уникальным. Я получаю ошибку валидации для "title", если оно null, но для остальных я получаю ошибку "Duplicate entry". Остальные запросы для Employees и Customers работают отлично.Спасибо всем заранее. Ниже вы найдете необходимый код:
-----------MODELS------------------------------
class Employees(models.Model):
#auto increment id
email = models.EmailField(unique=True)
class Customers(models.Model):
#auto increment id
email = models.EmailField(unique=True, null=True, blank=True)
class Cases(models.Model):
#auto increment id
title = models.CharField(max_length=100)
assigned_to = models.ForeignKey(
Employees, on_delete=models.PROTECT, related_name='assignee')
created_by = models.ForeignKey(
Employees, on_delete=models.PROTECT, related_name='creator')
customer = models.ForeignKey(
Customers, on_delete=models.PROTECT, related_name='cases',null=True, blank=True)
-----------Serializers------------------------------
class SimpleEmployeeSerializer(serializers.ModelSerializer):
class Meta:
model = Employees
fields = ['id', 'full_name', ]
read_only_fields=('full_name',)
full_name = serializers.SerializerMethodField(method_name='get_full_name')
def get_full_name(self, obj):
return '{} {}'.format(obj.first_name, obj.last_name)
class SimpleCustomerSerializer(serializers.ModelSerializer):
class Meta:
model = Customers
fields = ['id', 'full_name',]
read_only_fields=('full_name',)
full_name = serializers.SerializerMethodField( method_name='get_full_name')
def get_full_name(self, obj):
return '{} {}'.format(obj.first_name, obj.last_name)
class ViewUpdateCaseSerializer(WritableNestedModelSerializer, serializers.ModelSerializer):
class Meta:
model = Cases
fields = ['id', 'category', 'title', 'description', 'customer', 'assigned_to',
'created_by', 'priority', 'status', 'creation_date', 'start_date', 'resolved_date',
'due_date', 'comments', 'cost', 'earning_fixed','earning_percent', 'clear_earning',
'price_without_vat','price_with_vat']
customer = SimpleCustomerSerializer()
assigned_to = SimpleEmployeeSerializer()
created_by = SimpleEmployeeSerializer()
-----------Views------------------------------
@api_view(['GET', 'POST'])
def cases_list(request):
if request.method == 'GET':
queryset = Cases.objects.select_related('customer', 'assigned_to', 'created_by').all()
serializer = ViewUpdateCaseSerializer(queryset, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = ViewUpdateCaseSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
@api_view(['GET', 'PUT', 'PATCH', 'DELETE'])
def case_detail(request, id):
case = get_object_or_404(Cases, pk=id)
if request.method == 'GET':
serializer = ViewUpdateCaseSerializer(case)
return Response(serializer.data)
elif request.method == 'PUT':
serializer = ViewUpdateCaseSerializer(case, data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)
elif request.method == 'PATCH':
serializer = ViewUpdateCaseSerializer(case, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
print("patch serializer: ", serializer.data)
return Response(serializer.data)
elif request.method == 'DELETE':
case.delete()
return Response( status=status.HTTP_204_NO_CONTENT)
В итоге, кроме "Дублирующей записи", я получил 1 пустую строку в таблице Employee на Mysql db и 1 пустую строку в таблице Customer. Как мне решить эту проблему?