Необходимо получить два определенных значения полей из одной модели в другую по отдельности в django API rest framework
модель 1
class Users(models.Model):
employee_name = models.CharField(max_length=50)
dob=models.DateField(max_length=8)
email=models.EmailField(max_length=254,default=None)
pancard=models.CharField(max_length=25,default=None)
aadhar=models.CharField(max_length=20,default=None)
personal_email_id=models.EmailField(max_length=254,default=None)
phone = PhoneField(blank=True)
emergency_contact_no=models.IntegerField(default=None)
emergency_contact_name=models.CharField(max_length=100,null=True)
relation=models.CharField(max_length=25,default=None)
blood_group=models.CharField(max_length=25,choices=BLOOD_GROUP_CHOICES,null=True)
desingnation=models.ForeignKey(Designation,on_delete=CASCADE,related_name="desingnation")
billable_and_non_billable=models.CharField(max_length=25,choices=BILLABLE_and_NON_BILLABLE_CHOICES,default='Billable')
joining_date=models.DateField(max_length=15,null=True)
relieving_date=models.DateField(max_length=15,null=True)
def __str__(self):
return self.employee_name
модель 2
class Consolidated(models.Model):
emp_name=models.ForeignKey(Users,on_delete=CASCADE)
proj_name=models.ForeignKey(Project,on_delete=CASCADE)
custom_name=models.ForeignKey(Client,on_delete=CASCADE)
Cons_date=models.ForeignKey(Add_Timelog,on_delete=CASCADE)
bill_no_bill=models.ForeignKey(Users,on_delete=CASCADE,related_name="billable_and_non_billable+")
def __str__(self):
return str(self.emp_name)
Сериализаторы
class UserSerializers(serializers.ModelSerializer):
class Meta:
model= Users
fields = '__all__'
class Consolidated_serializers(serializers.ModelSerializer):
class Meta:
model=Consolidated
fields= '__all__'
Виды
class UserViewset(viewsets.ModelViewSet):
permission_classes=(permissions.IsAdminUser,)
queryset=models.Users.objects.all()
serializer_class=serializers.UserSerializers
class Consolidated_ViewSet(viewsets.ModelViewSet):
permission_classes=(permissions.IsAdminUser,)
queryset=models.Consolidated.objects.all()
serializer_class=serializers.Consolidated_serializers
На самом деле я застрял на середине, так как мне нужно взять значения из поля 'billable_and_non_billable' из модели Users и отобразить эти значения в поле Consolidated модели bill_no_bill. С помощью приведенного выше кода я могу только взять значения employee_name из модели Users в emp_name из модели Consolidated и то же самое значение отображается в поле bill_no_bill. Пожалуйста, помогите мне найти какие-либо пути решения этой проблемы, так как я новичок в этом Django. По сути, это должен быть API, который работает с методом GET.
Вы получаете одно и то же значение, потому что вы используете внешний ключ к модели пользователя для emp_name и bill_no_bill. Внешние ключи используются для отношений "многие к одному" между моделями.
См: https://docs.djangoproject.com/en/4.0/topics/db/examples/many_to_one/
Таким образом, ваша консолидированная модель должна быть следующей:
Class Consolidated(models.Model):
employee=models.ForeignKey(Users,on_delete=CASCADE)
project=models.ForeignKey(Project,on_delete=CASCADE)
custom_name=models.ForeignKey(Client,on_delete=CASCADE)
cons_date=models.ForeignKey(Add_Timelog,on_delete=CASCADE)
Для получения значений этих полей вы можете использовать Вложенное представление объектов в сериализации DRF.
Альтернативно вы можете переопределить метод to_representation сериализатора или SerializerMethodField