Получение результата от одного ко многим - PullRequest
0 голосов
/ 07 мая 2020

Я пробую и ошибаюсь в своем запросе django. Я пытаюсь получить поле с одним значением столбца, рядом с которым содержатся списки элементов. В основном я пытаюсь выяснить, как достичь этого результата:

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

Я пробовал в оболочке python этот запрос, и он дал мне следующий результат:

>>> 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}]>

На result Я понимаю, почему включено «сообщение» (одно из полей в таблице каналов), и проблема в том, что я не знаю, как я собираюсь исключить его, чтобы получить желаемый результат.

В этой операции задействованы три модели:

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'

Ответы [ 3 ]

1 голос
/ 07 мая 2020

Вы не определили пользовательский 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()
0 голосов
/ 07 мая 2020

Вы можете написать сериализаторы для каждой модели, а затем установить определенное c поле, которое вы хотите использовать

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)
0 голосов
/ 07 мая 2020

Если вы используете django rest framework , просто создайте сериализатор следующим образом:

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 shell:

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