我有三个模型," Item" ,"卖方"和"用户" 。 用户就像管理员一样,他可以创建卖家,每个卖家都会有一个唯一的ID假设" uid"。 用户创建的卖家可以创建商品,所以我想制作API,如果卖家创建了/发布新的项目,我想要(用户和卖家)和(卖家和物品)之间的反向关系。即用户创建的每个卖家都应该有一个包含他创建的所有卖家的字段。并且每个卖家都应该有一个文件,告诉创建它的用户的名字。卖方和物品之间的模拟。每个卖方都会有他创建的物品清单,每个物品都有一个已创建卖家的卖家。
现在我已经实现了用户和卖家的反向关系,但我无法创建卖方和物品的反向关系。我按照这些链接Tutorial 4: Authentication & Permissions和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中写什么?
在卖方模型中,使用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 。
任何帮助将不胜感激。
答案 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