Unable to use perform_create to make a reverse relationship between two model

285 views
Skip to first unread message

bhupendra singh chauhan

unread,
Feb 1, 2017, 5:15:10 PM2/1/17
to Django REST framework
I have three models, "Item" , "Seller" and "User" .
User is like admin he can create Seller and each Seller will have a unique id suppose "uid".
And The Sellers created by User can create Item , So I want to make API in which if a Seller creates/posts a new Item , I want a reverse relationship between (User and Seller) and (Seller and Item). i.e Every Seller created by User should have a field that have all Seller he created. And every seller should have a filed telling the name of User who created it. Simillary between Seller and Item .Every Seller will have list of Items he created and every Item will have a filed Seller who created it.


Now I have implemented User and Seller Reverse Relationship but I am not able to create Seller and Item reverse relation. I followed these link Tutorial 4: Authentication & Permissions and Serializer relations.
Here is my code snippet :

Model.py

class Seller(models.Model):
 UID
=models.CharField(max_length=50,unique=True)
 name
=models.CharField(max_length=100)
 
....
 super_owner
= models.ForeignKey('auth.User', related_name='seller_added')
 
 
def __unicode__(self):
   
return '%s'  (self.UID)
 
class Item(models.Model):
 name
=models.CharField(max_length=250)
 
....
 seller_uid
= models.ForeignKey(Seller,related_name='items_added', on_delete=models.CASCADE)


 
def __unicode__(self):
 
return '%s: %d' % (self.name, self.mrp)

Serializer.py


class UserSerializer(serializers.ModelSerializer):
 seller_added
= serializers.PrimaryKeyRelatedField(many=True, queryset=Seller.objects.all())
 
class Meta:
 model
= User
 fields
= ('id', 'username','seller_added')


class SellerSerializer(serializers.ModelSerializer):
 items_added
= serializers.StringRelatedField(many=True)
 super_owner
= serializers.ReadOnlyField(source='super_owner.username')  

 
 
class Meta:
   model
= Seller
   fields
= ('UID','name','items_added','super_owner')


class ItemSerializer(serializers.ModelSerializer):
 
 seller_uid
= serializers.ReadOnlyField(source='seller_uid.UID')

 
class Meta:
   model
= Item
   fields
= ('id', 'name', 'seller_uid')


Views.py

class UserViewSet(viewsets.ReadOnlyModelViewSet):
   
"""
    This viewset automatically provides `list` and `detail` actions.
    """

    queryset
= User.objects.all()
    serializer_class
= UserSerializer

class ItemViewSet(viewsets.ModelViewSet):
   
    queryset
= Item.objects.all()
    serializer_class
= ItemSerializer
    permission_classes
= (permissions.IsAuthenticatedOrReadOnly,IsOwnerOrReadOnly_seller,)


 
 
   
def perform_create(self, serializer):
        serializer
.save(seller_uid=self.request.user.seller_uid)  
 


class SellerViewSet(viewsets.ModelViewSet):
    queryset
= Seller.objects.all()
    serializer_class
= SellerSerializer
    permission_classes
= (permissions.IsAuthenticatedOrReadOnly,
   
   
def perform_create(self, serializer):
        serializer
.save(super_owner=self.request.user)  



         I dont know what should I write in perform_create of ItemViewSet so that every Item will have a Seller id i.e seller_uid .
For SellerViewSet I copied super_owner=self.request.user  from DRF tutorial and it worked.
Any help will be appreciated.






   



王祥

unread,
Feb 3, 2017, 4:14:02 AM2/3/17
to Django REST framework
serializer.save(seller_uid=self.request.user.seller_uid)
If the request.user is an instance of django.contrib.auth.models.User, it should have not field named seller_uid. May be the request.user is an instance of Seller, then you should use request.user. By the way, the field names `seller_uid` make people confused, u can just use seller. More information can be found here.

在 2017年2月2日星期四 UTC+8上午6:15:10,bhupendra singh chauhan写道:
Reply all
Reply to author
Forward
0 new messages