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

Api 无法使用perform_create在两个模型之间建立反向关系,api,relational-database,foreign-key-relationship,django-rest-framework,Api,Relational Database,Foreign Key Relationship,Django Rest Framework,我有三种型号,“商品”、“卖家”和“用户”。 用户就像管理员一样,他可以创建卖家,每个卖家都有一个唯一的id,假设是“uid”。 而由用户创建的卖家可以创建商品,因此我想制作一个API,如果卖家创建/发布一个新的商品,我想在(用户和卖家)和(卖家和商品)之间建立一个反向关系。i、 e每个由用户创建的卖家都应该有一个包含他创建的所有卖家的字段。每个卖家都应该有一个文件,上面写着创建它的用户的名字。卖家和物品之间的相似性。每个卖家都有他创建的物品列表,每个物品都有一个创建它的存档卖家 现在我已经实现

我有三种型号,“商品”、“卖家”和“用户”用户就像管理员一样,他可以创建卖家,每个卖家都有一个唯一的id,假设是“uid”。 而由用户创建的卖家可以创建商品,因此我想制作一个API,如果卖家创建/发布一个新的商品,我想在(用户和卖家)和(卖家和商品)之间建立一个反向关系。i、 e每个由用户创建的卖家都应该有一个包含他创建的所有卖家的字段。每个卖家都应该有一个文件,上面写着创建它的用户的名字。卖家和物品之间的相似性。每个卖家都有他创建的物品列表,每个物品都有一个创建它的存档卖家

现在我已经实现了用户和卖家的反向关系,但我无法创建卖家和商品的反向关系。我跟随这些链接,然后。 以下是我的代码片段:

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)
序列化程序.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)  
我不知道在执行项目视图集的创建时应该写什么?? 在卖方
模型中,通过使用
super\u owner=self.request.user
,从方法perfom\u create初始化文件super\u owner。类似地,我想初始化项目模型中声明的卖方uid文件。从项目序列化程序中删除此行时,从SellerViewSet删除执行创建。我的api可以工作,但当我发布时,它会要求选择我想用作外键的卖家。但我想自动完成这件事。就像超级业主的情况一样。简单地说,应该在项目视图集的执行创建中写些什么来直接设置卖家uid

任何帮助都将不胜感激。

您的问题是
super\u owner
是用
ReadOnlyField
编写的,因此您的序列化程序不会读取它。只需删除该字段并使用默认字段。现在,您可以向它发送
user.id
,还可以删除
perform\u create

如果您想要一个特殊的表示法,尽管您可以重写
to_表示法
序列化器方法:

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

嗨,谢谢你的回答。它在其他方面帮助了我。但我的问题是别的。在卖方模型中,通过使用
super\u owner=self.request.user
从perfom\u create方法初始化已存档的super\u owner。同样,我想初始化在项目模型中声明的卖方uid文件。通过删除seller\u uid=serializers.ReadOnlyField(source='seller\u uid.uid')@BhupendraSinghChauhan抱歉,我不明白你的问题,你想创建一个从
seller
模型到
项目的链接吗?或者在创建卖家时创建一个
项目
?在第一种情况下,您只需删除
StringRelatedField
,然后在字段中写入
items\u added
,这样您就可以将
Item
id
s传递给
items\u added
字段。如果你想创建
项目
,你应该在
Seller
serizlier中重写
create
方法,或者在
Seller
管理器中移动该逻辑,这是创建两个相关模型的常用方法。我已经编辑了我的问题。我想现在会清楚的。我想链接卖方和项目。Thanks@BhupendraSinghChauhan那么,像您使用
SelerSerializer
一样,从项目序列化程序中删除此字段“seller\u uid=serializers.ReadOnlyField(source='seller\u uid.uid')”并将卖家id传递到此字段有什么问题吗?是的,我已经删除了这一行。之后,当我使用项目api时,它有一个seller\u uid属性,现在我必须从所有创建的seller的下拉列表中选择我想要选择作为外键的seller。所以我怀疑,如果使用此api从某个应用程序发出post请求。我必须正常设置卖方uid,因为项目中的所有其他属性都是可编辑/可写的,但卖方uid有一个下拉列表@伊万