Api 无法使用perform_create在两个模型之间建立反向关系
我有三种型号,“商品”、“卖家”和“用户”。 用户就像管理员一样,他可以创建卖家,每个卖家都有一个唯一的id,假设是“uid”。 而由用户创建的卖家可以创建商品,因此我想制作一个API,如果卖家创建/发布一个新的商品,我想在(用户和卖家)和(卖家和商品)之间建立一个反向关系。i、 e每个由用户创建的卖家都应该有一个包含他创建的所有卖家的字段。每个卖家都应该有一个文件,上面写着创建它的用户的名字。卖家和物品之间的相似性。每个卖家都有他创建的物品列表,每个物品都有一个创建它的存档卖家 现在我已经实现了用户和卖家的反向关系,但我无法创建卖家和商品的反向关系。我跟随这些链接,然后。 以下是我的代码片段: Model.pyApi 无法使用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每个由用户创建的卖家都应该有一个包含他创建的所有卖家的字段。每个卖家都应该有一个文件,上面写着创建它的用户的名字。卖家和物品之间的相似性。每个卖家都有他创建的物品列表,每个物品都有一个创建它的存档卖家 现在我已经实现
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有一个下拉列表@伊万