无法使用 perform_create 在两个模型之间建立反向关系

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

我有三个模型,"Item"、"Seller" 和 "User"User 就像管理员一样,他可以创建 Seller 并且每个 Seller 都会有一个唯一的 ID 假设 "uid". 而User创建的Sellers可以创建Item,所以我想做API其中如果 Seller creates/posts 一个新的 Item ,我想要(用户和卖家)和(卖家和项目)之间的反向关系).即用户创建的每个卖家都应该有一个包含他创建的所有卖家的字段。每个卖家都应该有一个文件,告诉创建它的用户的名字。 Seller 和 Item 之间类似。每个 Seller 都会有他创建的 Items 列表,每个 Item 都会有一个创建它的已归档 Seller。

现在我已经实现了用户和卖家的反向关系,但是我无法创建卖家和商品的反向关系。我关注了这些 link Tutorial 4: Authentication & Permissions and Serializer 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不知道应该写什么??Seller 模型中,提交的 super_owner 由方法 perfom_create 初始化使用 super_owner=self.request.user。类似地,我想初始化 seller_uidItem 模型中声明的文件。从 ItemSerializer seller_uid=serializers.ReadOnlyField(source='seller_uid.UID') 中删除此行并从 SellerViewSet 中删除 perform_create .我的 api 有效,但是当我 post 它要求 select 我想用作外键的 Seller。但我想自动完成这件事。如 super_owner 的情况。简单来说,在perform_create of ItemViewSet中应该写什么来设置seller_uid直接。
任何帮助将不胜感激。

您的问题是 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