【发布时间】:2017-06-18 20:53:57
【问题描述】:
我有三个模型,"Item" 、 "Seller" 和 "User" 。 User 就像管理员一样,他可以创建 Seller,每个 Seller 都会有一个唯一的 id,假设为“uid”。 而 User 创建的 Sellers 可以创建 Item ,所以我想制作一个 API,如果 Seller 创建/posts a new Item ,我想要(用户和卖家)和(卖家和物品)之间的反向关系。即用户创建的每个卖家都应该有一个包含他创建的所有卖家的字段。每个卖家都应该有一个文件,告诉创建它的用户的名字。卖家和商品之间的相似性。每个卖家都会有他创建的商品列表,并且每个商品都会有一个提交的卖家创建它。
现在我已经实施了用户和卖家反向关系,但我无法创建卖家和商品反向关系。我关注了这些链接Tutorial 4: Authentication & Permissions 和Serializer relations。 这是我的代码 sn-p :
模型.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)
不知道ItemViewSet的perform_create应该写什么??
在 Seller 模型中,归档的 super_owner 是通过使用 super_owner=self.request.user 从方法 perfom_create 初始化的。同样,我想初始化在 Item 模型中声明的归档 seller_uid。从 ItemSerializer seller_uid=serializers.ReadOnlyField(source='seller_uid.UID') 中删除此行并从 SellerViewSet 中删除 perform_create。我的 api 有效,但是当我发布它时,它要求选择我想用作外键的 Seller。但我想自动做这件事。如 super_owner 的情况。简单来说应该在ItemViewSet的perform_create中写什么来直接设置seller_uid。
任何帮助将不胜感激。
【问题讨论】:
标签: api relational-database foreign-key-relationship django-rest-framework