python - How to add data to ManyToMany field using Django Rest Framework? -
i'm relatively new django , looking add data many-to-many field using serializers rest framework.
my model:
class ingfamily(models.model): name=models.charfield(max_length=30, unique=true, verbose_name='ingredient parent') class userprofile(models.model): user=models.foreignkey(user) allergies=models.manytomanyfield(ingfamily, verbose_name='allergies', null=true) now, want add data userprofile model using rest api.
i've looked around, couldn't find anywhere.
so far i've achieved:
serializer:
class ingflyserializer(serializers.modelserializer): class meta: model = ingfamily fields= ('name',) class userprofileserializer(serializers.modelserializer): allergies=ingflyserializer(many=true,) class meta: model = userprofile fields=('allergies',) def create(self, validated_data): allergies_data =validated_data.pop('allergies', []) #import pdb;pdb.set_trace() user1=userprofile.objects.create(**validated_data) allergy in allergies_data: al=ingfamily.objects.filter(name=allergy.get('name')) #al.name=allergy.get('name') user1.allergies.add(al) user1.save() return user1 when try using this, "al" empty.
view:
class user_profile(generics.listcreateapiview): serializer_class = userprofileserializer permission_classes = (permissions.isauthenticated,) def get_queryset(self): user = self.request.user return userprofile.objects.filter(user=user) def perform_create(self, serializer): #import pdb; pdb.set_trace() serializer.save(user=self.request.user) class userdetail(generics.retrievedestroyapiview): serializer_class = userprofileserializer permission_classes = (permissions.isauthenticated,) def get_queryset(self): user1 = self.request.user return userprofile.objects.filter(user=user1) my post request this:
{"allergies": [{"name": ["beef"]},{"name": ["pork"]}]} i've been stuck on while, appreciated :)
couple of things can tried :
- it might possible database dont have of allergies coming in user data. thats why al coming empty.
- saving user data before add allergies it. important.
- by using ipdb or pdb, try understand in data form 'allergy' , 'allergies_data' coming out. if indeed have written, there no reason following code shouldnt work.
def create(self, validated_data): allergies_data =validated_data.pop('allergies') user1=userprofile.objects.create(**validated_data) user1.save() allergy in allergies_data: al=ingfamily.objects.get_or_create(name=allergy['name']) user1.allergies.add(al) return user1
Comments
Post a Comment