В моделях django нельзя установить несколько ключей forign в одной таблице
Фактически мой код выглядит следующим образом,
Models.py
class Employee(models.Model):
employee_code = models.IntegerField(unique=True,primary_key=True)
employee_name = models.CharField(max_length=50,unique=True)
class LeaveRequest(models.Model):
emp_name = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name='empl_name')
emp_code = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name='emp_code',default='')
leave_type = models.CharField(choices=( ('CL', 'Casual leave'),
('SL', 'Sick leave'),
('ML', 'Medical leave'),
('Comp off', 'Compensation')
),default='',max_length=20)
serializers.py
class EmployeeSerializer(serializers.ModelSerializer):
class Meta:
model = Employee
fields = '__all__'
class LeaverequestSerializer(serializers.ModelSerializer):
class Meta:
model = LeaveRequest
fields = '__all__'
Views.py
class Empcreate(CreateAPIView):
serializer_class = EmployeeSerializer
def post(self, request):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response({
"user": serializer.data,
"message": "User Created Successfully..!",
})
class Leaverequest(CreateAPIView):
serializer_class = LeaverequestSerializer
def post(self, request):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response({
"user": serializer.data,
"message": "Request Created Successfully..!",
})
На самом деле, поскольку я сопоставил два внешних ключа из одной таблицы (emp_name и code), возникает проблема. Всякий раз, когда я создаю запрос в модуле запроса на отпуск, emp_name также показывает emp_code, как показано на изображении ниже. Но я хочу отображать имя, может ли кто-нибудь предложить решение для этого, также как я могу установить различные условия для различных типов отпусков, где создавать условия? Сериализаторы или представления? Является ли for loop хорошим вариантом для создания различных условий для типов отпусков?
вместо этого:
emp_name = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name='empl_name')
Tryt this:
emp_name = models.OneToOneField(Employee, on_delete=models.CASCADE, related_name='empl_name')
Вы можете исправить это на страницах администратора, просто переопределив метод __str__
вашего класса:
# models.py
class Employee(models.Model):
employee_code = models.IntegerField(unique=True,primary_key=True)
employee_name = models.CharField(max_length=50,unique=True)
def __str__(self):
return self.employee_name
Существует несколько способов получения различных атрибутов в зависимости от типа оставления, лучший способ зависит от вашего сценария использования.
Вы можете переопределить метод to_representation()
внутри сериализатора:
# serializers.py
class LeaveRequestSerializer(serializers.ModelSerializer):
def to_representation(self, instance):
representation = super(LeaveRequestSerializer, self).to_representation(instance)
if instance.type == 'CL':
representation['...'] = ...
return representation
class Meta:
model = LeaveRequest
fields = '__all__'