Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 有没有一种方法可以在序列化数据之后只获取queryset中的特定字段,而不在drf中创建其他序列化程序?_Django_Python 3.x_Django Rest Framework - Fatal编程技术网

Django 有没有一种方法可以在序列化数据之后只获取queryset中的特定字段,而不在drf中创建其他序列化程序?

Django 有没有一种方法可以在序列化数据之后只获取queryset中的特定字段,而不在drf中创建其他序列化程序?,django,python-3.x,django-rest-framework,Django,Python 3.x,Django Rest Framework,我需要做一个查询,在那里我想要得到特定的字段,然后序列化它,只保留我在查询中得到的特定字段 models.py class Search(models.Model): NEUTRAL = 'None' POSITIVE = 'P' NEGATIVE = 'N' POLARITY_CHOICES = [ (NEUTRAL, 'Neutral'), (POSITIVE, 'Positive'), (NEGATIVE, '

我需要做一个查询,在那里我想要得到特定的字段,然后序列化它,只保留我在查询中得到的特定字段

models.py

class Search(models.Model):
    NEUTRAL = 'None'
    POSITIVE = 'P'
    NEGATIVE = 'N'
    POLARITY_CHOICES = [
        (NEUTRAL, 'Neutral'),
        (POSITIVE, 'Positive'),
        (NEGATIVE, 'Negative'),
    ]
    user = models.ForeignKey(User,related_name='searched_user_id',on_delete=models.CASCADE)
    word = models.CharField( max_length = 100)
    social_network = models.ForeignKey(SocialNetwork,related_name='search_social_network_id',on_delete=models.CASCADE)
    polarity = models.CharField(
        max_length=4,
        choices=POLARITY_CHOICES,
        default=NEUTRAL,
    )
    sentiment_analysis_percentage = models.FloatField(default=0)
    topic = models.ForeignKey(Topic,related_name='search_topic_id',on_delete=models.CASCADE)
    liked = models.IntegerField(default=0)  
    shared = models.IntegerField(default=0) 
    is_active = models.BooleanField(default=True)
    is_deleted = models.BooleanField(default=False)
    updated_date=models.DateTimeField(auto_now=True)
    searched_date = models.DateTimeField(auto_now_add=True)
序列化程序.py

class SearchSerializer(serializers.ModelSerializer):
    searched_date = serializers.DateTimeField(format="%d-%m-%Y")
    class Meta:
        model = Search
        fields = ('__all__')

class RecentSearchSerializer(serializers.ModelSerializer):
    searched_date = serializers.DateTimeField(format="%d-%m-%Y")
    class Meta:
        model = Search
        fields = ('user','social_network','word','searched_date')

class SentimentAnalysisSerializer(serializers.ModelSerializer):
    searched_date = serializers.DateTimeField(format="%d-%m-%Y")
    class Meta:
        model = Search
        fields = ('polarity','searched_date','sentiment_analysis_percentage')
SearchSerializer是用于搜索的主要序列化程序,RecentSearchSerializer是用于在DRF api视图中传递数据和过滤的序列化程序,最后我创建了ConferenceAnalysisSerializer以保留我需要的特定字段:

api.py

class SearchViewSet(viewsets.ModelViewSet):
    queryset = Search.objects.filter(
        is_active=True,
        is_deleted=False
    ).order_by('id')
    permission_classes = [
        permissions.AllowAny
    ]
    serializer_class = SearchSerializer
    pagination_class = StandardResultsSetPagination

    def __init__(self,*args, **kwargs):
        self.response_data = {'error': [], 'data': {}}
        self.code = 0

    def get_serializer_class(self):
        if self.action in ['recent_search','word_details']:
            return RecentSearchSerializer
        return SearchSerializer

    @action(methods=['post'], detail=False)
    def word_details(self, request, *args, **kwargs):
        try:
            self.response_data['data']['word'] = kwargs['data']['word']
            queryset = Search.objects.filter(
                is_active=True,
                is_deleted=False,
                social_network=kwargs['data']['social_network'],
                user_id=kwargs['data']['user'],
                word=kwargs['data']['word']
            ).order_by('id')
            import pdb;pdb.set_trace()
            serializer = SentimentAnalysisSerializer(queryset, many=True)
            self.response_data['data']['timeline_word_twitter_polarity'] = json.loads(json.dumps(serializer.data))
我做了这个解决方案,效果很好,但是有没有一种方法可以在不创建另一个序列化程序的情况下实现相同的行为?我是说,使用SearchSerializer

我尝试了以下示例,但发现了以下错误:

(Pdb) queryset = Search.objects.filter(is_active=True,is_deleted=False,social_network=kwargs['data']['social_network'],user_id=kwargs['data']['user'],word=kwargs['data']['word']).values('polarity','sentiment_analysis_percentage','searched_date').order_by('id')
(Pdb) serializer = RecentSearchSerializer(queryset, many=True)
(Pdb) self.response_data['data']['timeline_word_twitter_polarity'] = json.loads(json.dumps(serializer.data))
*** KeyError: "Got KeyError when attempting to get a value for field `user` on serializer `RecentSearchSerializer`.\nThe serializer field might be named incorrectly and not match any attribute or key on the `dict` instance.\nOriginal exception text was: 'user'."
(Pdb) 
首先,我认为这些错误与此相关,但根据这一点,我不会像问题解释那样传递
数据
参数,因此我无法检查
(is\u valid())
的错误是什么

我使用的是DRF的最新版本:djangorestframework==3.10.3

我希望得到这个结果,但使用SearchSerializer(我需要对特定字段进行其他查询,我的意思是我不需要传递搜索模型的所有字段),但我不知道这是否可能

(Pdb) serializer = SentimentAnalysisSerializer(queryset, many=True)
(Pdb) self.response_data['data']['timeline_word_twitter_polarity'] = json.loads(json.dumps(serializer.data))
(Pdb) self.response_data['data']['timeline_word_twitter_polarity']
[{'searched_date': '09-10-2019', 'polarity': 'P', 'sentiment_analysis_percentage': 0.0}, {'searched_date': '09-10-2019', 'polarity': 'N', 'sentiment_analysis_percentage': 0.0}]

提前感谢,任何帮助都将不胜感激。

嗯,错误很清楚

您可以使用
值将查询限制为仅返回某些字段。因此序列化程序无法序列化它,因为缺少很多

但是,以下方法应该适合您

注意:我不喜欢这个-我宁愿像你一样有两个独立的序列化程序。但它可能会帮助你

class SearchSerializer(serializers.ModelSerializer):
    searched_date = serializers.DateTimeField(format="%d-%m-%Y")
    class Meta:
        model = Search
        fields = ('__all__')

    def __init__(self, instance=None, data=empty, **kwargs):
        super(SearchSerializer, self).__init__(instance, data, **kwargs)
        if instance is not None and instance._fields is not None:     
            allowed = set(instance._fields)
            existing = set(self.fields.keys())
            for fn in existing - allowed:
                self.fields.pop(fn)

基本上,它只保留所提供的
实例中的字段

谢谢,它工作得很好,有了
def\uuu init\uuu(self,instance=None,data=None,**kwargs)
的修复程序。同样感谢您的建议,我也认为最好使用不同的序列化程序,但这取决于所需的总查询量。啊,是的,
empty
是django rest framework的小实用程序类,可以在
rest\u framework.fields
模块中找到。如果您感兴趣,也可以解释为什么需要它。
class SearchSerializer(serializers.ModelSerializer):
    searched_date = serializers.DateTimeField(format="%d-%m-%Y")
    class Meta:
        model = Search
        fields = ('__all__')

    def __init__(self, instance=None, data=empty, **kwargs):
        super(SearchSerializer, self).__init__(instance, data, **kwargs)
        if instance is not None and instance._fields is not None:     
            allowed = set(instance._fields)
            existing = set(self.fields.keys())
            for fn in existing - allowed:
                self.fields.pop(fn)