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

У меня есть следующие модели:

class RestaurantItemImages(models.Model):
    restauraunt_item = models.ForeignKey('RestaurantItem',on_delete=models.CASCADE)
    image = models.ImageField()
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)

    def __str__(self):

        return self.restauraunt_item.name


class RestaurantItem(models.Model):
    name            =           models.CharField(max_length=255)
    description     =           models.TextField()
    price           =           models.FloatField()
    restauraunt     =           models.ForeignKey('Restauraunt',on_delete=models.CASCADE)
    featured        =           models.BooleanField(default=False)
    popular         =           models.BooleanField(default=False)
    menu            =           models.ManyToManyField('MenuType')  

    def __str__(self):
        return self.name

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

featured_items = RestaurantItem.objects.filter(restauraunt__slug=slug).values('name','price','restaurantitemimages__image')


 "featured_items": [
        {
            "name": "Lo Mein Lunch Special",
            "price": 700.0,
            "restaurantitemimages__image": "hero_WlE875w.jpg"
        },
        {
            "name": "Lo Mein Lunch Special",
            "price": 700.0,
            "restaurantitemimages__image": "ASQ.png"
        },
        {
            "name": "Boneless Spare Ribs Lunch Special",
            "price": 100.0,
            "restaurantitemimages__image": null
        },
        {
            "name": "Vegetable Roll (1)",
            "price": 213.0,
            "restaurantitemimages__image": null
        }
    ]

Если вы видите один и тот же элемент повторяется несколько раз для разных изображений, поэтому есть способ, которым я могу разместить все изображения в одном объекте. Я тоже смотрел на prefetch_related, но в данном случае это не имело смысла для меня.

Ответы [ 2 ]

0 голосов
/ 07 января 2020

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

class RestaurantItemImagesSerializer(ModelSerializer):
    class Meta:
        model = RestaurantItemImages
        fields = ['image']




class RestaurantItemSerializer(ModelSerializer):
    restaurantitemimages_set = RestaurantItemImagesSerializer(many=True)
    class Meta:
        model = RestaurantItem
        fields = ['name','description','price','restaurantitemimages_set']

Теперь вместо того, чтобы использовать запрос фильтра выше, я просто вызываю свой связанный объект и затем сериализую его, используя этот сериализатор в моем представлении API на основе функций.

restaurantitem_obj = RestaurantItem.objects.filter(restauraunt__slug=slug)
featured_items = RestaurantItemSerializer(restaurantitem_obj,many=True)

Он дает желаемый результат, как показано ниже:

{
    "featured_items": [
        {
            "name": "Item 1",
            "description": "Test Description",
            "price": 700.0,
            "restaurantitemimages_set": [
                {
                    "image": "/media/WlE875w.jpg"
                },
                {
                    "image": "/media/ASqUIVb.png"
                }
            ]
        },
        {
            "name": "Item2",
            "description": "adasdasd",
            "price": 100.0,
            "restaurantitemimages_set": []
        },
        {
            "name": "Roll (1)",
            "description": "asdasda",
            "price": 213.0,
            "restaurantitemimages_set": []
        }
    ]

}
0 голосов
/ 07 января 2020

взгляните на Django Rest Framwork. Вложенный ModelSerializer делает именно то, что вы хотите https://www.django-rest-framework.org/api-guide/serializers/#specifying -nested-serialization

...