0

我有三个模型,“商品”,“卖家”和“用户”用户就像管理员他可以创建卖方和每个卖方将有一个唯一的id假设“uid”。 和卖方通过用户创建可以创建项目,所以我想在这如果卖家创建/发布一个新项目,我想之间(用户和卖方)的反向关系API和(卖方和物品)。即由用户创建的每个卖家都应该有一个拥有他创建的所有卖家的字段。每个卖家都应该有一个告诉创建它的用户的名字。 Simillary在卖方和Item之间。每个卖方都会有他创建的物品清单,每个物品都有一个已经存档的卖方创建它。无法使用perform_create在两个模型之间建立反向关系

现在我已经实现了用户和卖方反向关系,但我无法创建卖家和项目反向关系。我跟着这些链接Tutorial 4: Authentication & PermissionsSerializer 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从方法perfom_create通过使用super_owner=self.request.user initilised。 Similary我想初始化seller_uid中声明的项目型号。从删除此行ItemSerializerseller_uid=serializers.ReadOnlyField(source='seller_uid.UID')和删除perform_createSellerViewSet。我的api工程,但当我发布它要求选择卖方,我想用作外键。但我想自动做这件事。至于super_owner的情况。简单的话应该写什么perform_createItemViewSet要直接设置seller_uid
任何帮助将不胜感激。

回答

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 
+0

斐伊川感谢answer.It帮我一些其他的方式。但我的问题是别的。在**卖家**模型中,通过使用'super_owner = self.request.user',可以从方法** perfom_create **中初始化字段** super_owner **。 Similary我想初始化在Item Model中声明的seller_uid的字段。通过删除seller_uid = serializers.ReadOnlyField(source ='seller_uid.UID') –

+0

@BhupendraSinghChauhan对不起,我不明白你的问题,你想创建一个从'卖家'模型到'Item'的链接?或者在创建'Seller'时创建一个'Item'?在第一种情况下,您可以删除'StringRelatedField'并在字段中写'items_added',这样您就可以将'Item'的'id's传递给'items_added'字段。如果你想创建'Item',你应该在'Seller' serizlier中重写'create'方法或者在'Seller'管理器中移动该逻辑,这是创建两个相关模型的常用方法。 –

+0

Sry我编辑了我的问题。我认为现在会清楚。我想链接卖家和物品。由于 –

相关问题