有没有办法将自定义数据添加到一个列表API调用来使用Django的REST框架的ModelViewSet一个视图返回的结果数据?
我ModelViewSet视图附加到一个项目的模式。
在除了由列表API调用我想查询一个单独看模型和返回,与项目返回的项目清单,次数每件物品被看见。
我也想了“报价的一天”添加到返回的数据。
我已经搜查了DRF文件和一直无法找到如何做到这一点任何提及。
这里是我的代码。 该项目串行化器:
class ItemSerializer(serializers.ModelSerializer): username = serializers.SerializerMethodField() def get_username(self, obj): """ Note that query params can be accessed here as follows: request = self.context['request'] print request.query_params.get['fields'] """ value = str(obj.owner) return value def get_keywords(self, obj): value = str(obj.keywords) return value class Meta: model = Item fields = ('id', 'url', 'item_type', 'title', 'credits_applied', 'credits_left', 'credits_gifted', 'username', 'liked', 'disliked')
该视图看起来是这样的:
class ItemViewSet(viewsets.ModelViewSet): queryset = Item.objects.all().order_by('-date_added') serializer_class = ItemSerializer # When POSTing (creating) a new item add appropriate User instance to the serializer def perform_create(self, serializer): creator = User.objects.get(pk=self.request.data['owner_id']) serializer.save(owner=creator) def get_queryset(self): this_user = self.request.query_params.get('user', None) restrict_to_items_from_user_id = self.request.query_params.get('from', None) quantity = self.request.query_params.get('num', 20) # Use query params to determine what to return if restrict_to_items_from_user_id is not None: # API: /api/items/from=<id> # Return items owned by a specific user. Used by someone to get a list of the items they have added queryset = Item.objects.filter(owner=restrict_to_items_from_user_id, active=True).order_by('-date_added')[0:int(quantity)] elif this_user is not None: # API: /api/items/user=<id> # Return unseen items for the given user's browse feed # queryset = Item.objects.all().order_by('-date_added')[0:int(quantity)] queryset = Item.objects.filter(active=True, credits_left__gt=0).exclude(pk__in=Seen.objects.filter(user_id=this_user).values_list('item_id', flat=True))[0:int(quantity)] # :TO DO: Add option to list the items a user has liked! else: # API: /api/items # Return items not specific to a particular user (used for testing the app or when user wants to see stuff they have seen before) queryset = Item.objects.filter(active=True, credits_left__gt=0)[0:int(quantity)] return queryset
该项目和看型号有:
class Item(models.Model): ITEM_TYPES = ( ('V', 'Vine'), ('Y', 'YouTube'), ('P', 'Photo'), # Photo is stored by us on a CDN somewhere ('F', 'Flickr'), ('I', 'Instagram'), ('D', 'DeviantArt'), ('5', '500px'), ) owner = models.ForeignKey(User, on_delete=models.CASCADE) # Id of user who owns the item title = models.CharField(max_length=60, default='') # URL of where item resides (eg Vine or YouTube url) url = models.CharField(max_length=250, default='', unique=True) # URL of where item resides (eg Vine or YouTube url) item_type = models.CharField(max_length=1, choices=ITEM_TYPES) # Type of item (eg Vine|YoutTube|Instagram|etc.) keywords = models.ManyToManyField(Keyword, related_name='keywords') # Eg Art, Travel, Food, etc. credits_applied = models.IntegerField(default=10, help_text='Total number of credits applied to this item including any given by VeeU admin') # Records the total number of credits applied to the Item credits_left = models.IntegerField(default=10, help_text='The number of credits still remaining to show the item') # Number of credits left (goes down each time item is viewed credits_gifted = models.IntegerField(default=0, help_text='The number of credits this item has been gifted by other users') # Number of credits users have gifted to this item date_added = models.DateTimeField(auto_now_add=True) # When item was added liked = models.IntegerField(default=0) # Number of times this item has been liked disliked = models.IntegerField(default=0) # Number of times this item has been disliked active = models.BooleanField(default=True, help_text='If you mark this item inactive please say why in the comment field. Eg "Inapproriate content"') # True if item is available for showing comment = models.CharField(max_length=100, blank=True) # Comment to be applied if item is inactive to say why # Add defs here for model related functions # This to allow url to be a clickable link def item_url(self): return u'<a href="%s">%s</a>' % (self.url, self.url) item_url.allow_tags = True def __str__(self): return '%s: Title: %s, URL: %s' % (self.owner, self.title, self.url) # Record of which items have been viewed, when, and whether they were liked or not class Seen(models.Model): item_seen = models.ForeignKey(Item, on_delete=models.CASCADE) # id of the item that has been seen who_saw = models.ForeignKey(User, on_delete=models.CASCADE) # id of user who viewed it date_seen = models.DateTimeField(auto_now_add=True) # When item was viewed liked = models.BooleanField(help_text='If the item was liked this is set to true') class Meta: unique_together = ('item_seen', 'who_saw',)