无法使用perform_create在两个模型

时间:2017-02-01 22:38:08

标签: api relational-database foreign-key-relationship django-rest-framework

我有三个模型," Item" ,"卖方"和"用户" 用户就像管理员一样,他可以创建卖家,每个卖家都会有一个唯一的ID假设" uid"。 用户创建的卖家可以创建商品,所以我想制作API,如果卖家创建了/发布新的项目,我想要(用户和卖家)和(卖家和物品)之间的反向关系。即用户创建的每个卖家都应该有一个包含他创建的所有卖家的字段。并且每个卖家都应该有一个文件,告诉创建它的用户的名字。卖方和物品之间的模拟。每个卖方都会有他创建的物品清单,每个物品都有一个已创建卖家的卖家。

现在我已经实现了用户和卖家的反向关系,但我无法创建卖方和物品的反向关系。我按照这些链接Tutorial 4: Authentication & PermissionsSerializer relations进行了操作。 这是我的代码片段:

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)  

我不知道我应该在ItemViewSet的perform_create中写什么?卖方模型中,使用super_owner=self.request.user从方法 perfom_create 初始化已归档的 super_owner 。相似我想初始化项目模型中声明的 seller_uid 。从 ItemSerializer seller_uid=serializers.ReadOnlyField(source='seller_uid.UID')删除此行并从 SellerViewSet 删除 perform_create 。我的api工作,但当我发布它要求选择我想用作外键的卖方。但我想自动做这件事。如在super_owner的情况下。简单来说,应该在 ItemViewSet的 perform_create 中写什么直接设置 seller_uid
任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您的问题是super_owner写在ReadOnlyField中,因此您的序列化程序无法读取它。只需删除该字段并使用默认字段即可。现在,您可以向其发送user.id,也可以删除perform_create 如果你想要一个特殊的表示,你可以覆盖to_representation序列化方法:

class SellerSerializer(serializers.ModelSerializer):
    items_added = serializers.StringRelatedField(many=True) 

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

    def to_representation(self, instance):
        representation = super(SellerSerializer, self).to_representation(instance)
        representation['super_owner'] = instance.super_owner.username
        return representation