我在我的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'
你没有定义一个自定义的 related_name
在你 ForeignKey
领域 FeedMedia
.
所以你的默认反向关系访问器将是 <model_name>_set
譬如说. feedmedia_set
.
所以如果你想访问一个 Media
在...上的对象 FeedMedia
从 Feed
,它将是以下内容。
query = Feed.objects.filter(Q(feedmedia_set__isnull=True)|Q(feedmedia_set__isnull=False)).values('message','feedmedia_set__id','feedmedia_set__media_id').distinct()
如果你使用的是 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
你可以为每个模型编写序列化器,然后设置你想使用的特定字段。
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)