获得一比多的结果

问题描述 投票:0回答:1

我在我的django查询中做了一些尝试和错误。我试图得到一个字段的一列值,旁边包含元素列表。基本上我想知道如何达到这个结果。

{
  feed: {},
  [{
   id: 1,
   media_id: 11
  }, {
   id: 2,
   media_id: 22
  }]
}

我在python shell中尝试了这个查询,得到的结果是:

>>> query = Feed.objects.filter(Q(feedmedia__isnull=True)|Q(feedmedia__isnull=False)).values('message','feedmedia__id','feedmedia__media_id').distinct()

>>> print(query)


<FeedQuerySet [{'message': 'Classic motorcycles <3', 'feedmedia__id': 145, 'feedmedia__media_id': 152}, {'message': 'sample video', 'feedmedia__id': 147, 'feedmedia__media_id': 153}, {'message': 'Classic motorcycles <3', 'feedmedia__id': 146, 'feedmedia__media_id': 151}]>

在结果上,我明白了为什么 "消息"(Feed表中的一个字段)被包括在内,问题是我不知道如何排除它以获得所需的输出。

这就是这个操作所涉及的三个模型。

class Media(models.Model):
   original_url = models.CharField(max_length=200, null=False, unique=False)
   small_url = models.CharField(max_length=200, null=True, unique=False)
   medium_url = models.CharField(max_length=200, null=True, unique=False)
   large_url = models.CharField(max_length=200, null=True, unique=False)
   uploaded_at = models.DateTimeField(auto_now_add=True)

   class Meta:
     db_table = "media"


class Feed(models.Model):
   message = models.CharField(max_length=3000, null=True, unique=False)
   type = models.CharField(max_length=50, null=False, unique=False)
   category = models.CharField(max_length=50, null=False, unique=False)
   priority_level = models.IntegerField(default=0, null=False, unique=False)
   origin_location = models.CharField(max_length=100, null=True, unique=False)
   created_at = models.DateTimeField(auto_now_add=True)

   objects = FeedManager()

   class Meta:
     db_table = 'feed'


# Junction Table for Feed and Media
class FeedMedia(models.Model):
"""Model to represent gosam posts/feeds."""

   media = models.ForeignKey(Media, on_delete=models.CASCADE, null=False)
   feed = models.ForeignKey(Feed, on_delete=models.CASCADE, null=False)
   creator = models.ForeignKey(Profile, on_delete=models.CASCADE, null=False)

   objects = FeedMediaManager()

   class Meta:
     db_table = 'feed_media'
django django-models django-rest-framework django-orm
1个回答
1
投票

你没有定义一个自定义的 related_name 在你 ForeignKey 领域 FeedMedia.

所以你的默认反向关系访问器将是 <model_name>_set譬如说. feedmedia_set.

所以如果你想访问一个 Media 在...上的对象 FeedMediaFeed,它将是以下内容。

query = Feed.objects.filter(Q(feedmedia_set__isnull=True)|Q(feedmedia_set__isnull=False)).values('message','feedmedia_set__id','feedmedia_set__media_id').distinct()

0
投票

如果你使用的是 django rest框架然后简单地创建一个像这样的序列器。

class FeedMediaSerializer(serializer.ModelSerializer):
    class Meta:
       model = FeedMedia
       fields = ["id", "media_id"]


class FeedSerializer(serializer.ModelSerializer):
    media = FeedMediaSerializer(source="feedmedia", read_only=True)

    class Meta:
        model = Feed
        fields = ["message", "media"]

并尝试像这样的Python外壳。

>> query = Feed.objects.filter(Q(feedmedia__isnull=True)|Q(feedmedia__isnull=False))
>> FeedSerializer(query, many=True).data

0
投票

你可以为每个模型编写序列化器,然后设置你想使用的特定字段。

class FeedSerializer(serializers.ModelSerializer):
   class Meta:
       model = Fedd
       fields = '__all__' # for all fields
       fields = ('field_1', 'field_1', 'field_1') # for specific fields

然后在apiviews

class MyFilterView(APIView):
    def get(self, request)
         filter_data = Feed.objects.filter()#your filter
         serializer = FeedSerializer(filter_data, many=True) # many=True if are many results
         return Response(serializer.data)
© www.soinside.com 2019 - 2024. All rights reserved.