2016-11-15 69 views
0

我有一个简单ModelSerializer:Django的REST框架 - 过滤器外键项POST,PUT和PATCH

class OfferSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Offer 
     fields = ('id', 'accepted', 'comment', 'status', 'item_given', 'item_received') 

在这种模式下:

class Offer(models.Model): 
    accepted = models.BooleanField() 
    status = models.BooleanField() 
    comment = models.CharField(max_length=1000) 
    creation_date = models.DateTimeField("date published", default=timezone.now) 

    item_given = models.ForeignKey("items.Item", related_name='item_given', on_delete=models.CASCADE) 
    item_received = models.ForeignKey("items.Item", related_name='item_received', on_delete=models.CASCADE) 

    def __str__(self): 
     return self.comment 

而且它由以下几种观点:

class OfferViewSet(viewsets.ModelViewSet): 
    queryset = Offer.objects.all() 
    serializer_class = OfferSerializer 

外键item_given是另一个名为Item的模型,它在用户上有一个外键。

在django rest框架的生成表单中,我可以在创建新商品时为item_given字段选择任何商品。但我希望能够仅选择外键用户等于request.user的项目。

我试着编辑串行器中的def_queryset,但没有成功。 我怎样才能做到这一点?

我在一个帐户谁没有创建项目,但我得到的每一件物品。

https://i.stack.imgur.com/bVfxo.png

目前我正在登录与用户ID为3

{ 
    id: 1, 
    name: "asasd", 
    description: "sdffsd", 
    price_min: 123, 
    price_max: 234, 
    creation_date: "2016-11-15T17:35:11Z", 
    archived: false, 
    owner: 1, 
    category: 1, 
    image_set: [ ] 
}, 
{ 
    id: 2, 
    name: "sdfsdffiss", 
    description: "fsdfsd", 
    price_min: 124, 
    price_max: 1245, 
    creation_date: "2016-11-15T19:39:02.225543Z", 
    archived: false, 
    owner: 1, 
    category: 1, 
    image_set: [ ] 
}, 
{ 
    id: 8, 
    name: "Test", 
    description: "Test", 
    price_min: 123, 
    price_max: 234, 
    creation_date: "2016-11-15T20:42:34.492041Z", 
    archived: false, 
    owner: 3, 
    category: 1, 
    image_set: [ 
     5 
    ] 
} 

当我去创建一个新的报价,每一个项目在item_given字段中显示的

回答

1

你的意思是get_queryset,它不是一个序列化方法,它是一个视图集方法。因此,你必须是这样的:

class OfferViewSet(viewsets.ModelViewSet): 
    serializer_class = OfferSerializer 

    def get_queryset(self): 
     return Offer.objects.filter(item_given__owner=self.request.user) 
+0

我拥有试了一下,只写了“item_given__owner”而不是“item_given__user”,因为外键在Item模型中被命名为owner,但我仍然得到列表中的每个项目。我添加了一个显示下拉列表的图像。 – Servietsky

+0

您添加的图像已损坏。不过,你可以调试返回的报价,看看它们中的一些在'item_given.owner'中是否真的有不同的用户?因为如果确实如此,我唯一的猜测就是你正在打错视图,或者由于其他奇怪的原因'get_queryset'没有被执行。 – lucasnadalutti

+0

我已经添加了项目的输出。什么可以防止'get_queryset'被执行? – Servietsky

0

我解决不了的形式显示每一个项目,但我可以把它抛出一个错误,如果该项目不被用户

def validate(self, data): 
    if self.context['request'].user.userprofile != data['item_given'].owner: 
     raise serializers.ValidationError("Item given is not owned by the current user") 
    return data