Django-Rest-FrameWork Post-Foreignkey
Я использую DRF (Django-Rest-Framework)
my Models.py
class Followers(models.Model):
id = models.AutoField(primary_key=True)
followers_no = models.IntegerField()
class Person(models.Model):
followers = models.ForeignKey(Followers,null=True,blank=True,on_delete=models.CASCADE)
name = models.CharField(max_length=120)
age = models.IntegerField()
def __str__(self) -> str:
return self.name
мой serializers.py
class Personserializer(ModelSerializer):
followers = FollowerSerializer(read_only=True)
class Meta:
model = Person
fields = "__all__"
def validate(self,data):
if data['age'] < 18:
raise serializers.ValidationError('age should be more than 18')
return data
я хочу добавить данные о человеке с помощью поля Followers, для этого я создаю views.py
def get(self, request):
person_id = request.query_params.get('id')
try:
person = Person.objects.get(pk=person_id)
except Exception as e:
return Response({"status": False, "message": "Person not found"}, status=status.HTTP_404_NOT_FOUND)
serializer = Personserializer(person)
return Response({"status": True, "data": serializer.data}, status=status.HTTP_200_OK)
def post(self, request):
data = request.data
serializer = Personserializer(data=data)
if serializer.is_valid():
serializer.save()
return Response({'status': True, "message": "Person created", "data": serializer.data}, status=status.HTTP_201_CREATED)
return Response({"status": False, "message": "error", "error": serializer.error_messages}, status=status.HTTP_400_BAD_REQUEST)
если я попытаюсь опубликовать данные с помощью postman, как показано ниже
{
"followers": {
"id": 1,
"followers_no": 150
},
"name": "hello",
"age": 19
}
он показывает как нулевое значение последователей, вместо этого, если я передаю данные, он должен опубликовать
i Ожидается, что данные поля последователей будут храниться также
class FollowerSerializer(ModelSerializer):
class Meta:
model = Followers
fields = '__all__'
class Personserializer(ModelSerializer):
followers = FollowerSerializer()
class Meta:
model = Person
fields = "__all__"
def validate(self,data):
# remaining code here.....
def create(self, validated_data):
followers_data = validated_data.pop('followers', None)
if followers_data:
followers, created = Followers.objects.get_or_create(**followers_data)
validated_data['followers'] = followers
return Person.objects.create(**validated_data)
Followers.objects.get_or_create(**followers_data)
В этой строке, если экземпляр Followers с id=1 и followers_no=150 не существует, он будет создан. Если он существует, он будет извлечен и ассоциирован.