В моделях django нельзя установить несколько ключей forign в одной таблице

enter image description here Фактически мой код выглядит следующим образом, 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__'
Вернуться на верх