无法使用 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_uid 在 Item 模型中声明的文件。从 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
我有三个模型,"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_uid 在 Item 模型中声明的文件。从 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