Невозможно получить данные таблиц внешнего ключа в одном сериализаторе - PullRequest
1 голос
/ 21 октября 2019

Таблица заказов

class Orders(models.Model):
    restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE, blank=True, null=True)
    tableid=models.IntegerField()
    orderid=models.IntegerField()
    total_amount = models.DecimalField(max_digits=10, decimal_places=2)

Таблица статей для сохранения таких товаров, как пицца

class OrderArticle(models.Model):
    order = models.ForeignKey(Orders, on_delete=models.CASCADE)
    article = models.ForeignKey(Articles, on_delete=models.CASCADE)
    # article_options = models.ManyToManyField(ArticlesOptions)

Параметры статей для сохранения дополнительной начинки или любой другой доступный параметр

class OrderArticleOptions(models.Model):
    # order = models.ForeignKey(Orders, on_delete=models.CASCADE)
    article_option = models.ForeignKey(ArticlesOptions, on_delete=models.CASCADE)
    order_article = models.ForeignKey(OrderArticle, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)
    price = models.DecimalField(max_digits=10, decimal_places=2)

РЕДАКТИРОВАТЬ

Таблица параметров статьи

class ArticlesOptions(models.Model):
    articleoptionrestaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE , blank=True, null=True)
    optionname = models.ForeignKey(ArticlesOptionsName, on_delete=models.CASCADE, related_name="optionnames")
    min = models.IntegerField()
    max = models.IntegerField()
    choice_price = models.DecimalField(max_digits=10, decimal_places=2)
    choice = models.CharField(max_length=255)
    def __str__(self):
        return str(self.optionname)

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

https://www.django -rest-framework.org / API-путеводитель / отношения /

РЕДАКТИРОВАТЬ

Мои сериализаторы

class OrderSerializer(serializers.ModelSerializer):
    restaurant=RestaurantSerializer(required=False)
    class Meta:
        model = Orders
        fields = ['restaurant','tableid', 'orderid', 'total_amount']

class ArticlesSerializer(serializers.ModelSerializer):
    order = OrderSerializer(read_only=True)
    article=ListArticleSerializer(read_only=True)

    class Meta:
        model = OrderArticle
        fields = ['order', 'article']


class ArticlesOptionSerializer(serializers.ModelSerializer):
    article_option = ListCategoriesSerializer(  read_only=True)
    order_article=ArticlesSerializer(read_only=True)

    class Meta:
        model = OrderArticleOptions
        fields = ['article_option','order_article','quantity','price']
    depth=1

Мой view.py -

class OrderedArticles(APIView):
    def get(self, request, restid):

        Options=OrderArticleOptions.objects.filter(order_article=1)
        orderserlizer=ArticlesOptionSerializer(Options , many=True)
        return Response(success_response({'orders': orderserlizer.data},
                                         "Restaurant with this all data."), status=status.HTTP_200_OK)

Мой JSON-ответ

   "article_option":{  },
        "order_article":{  
           "order":{  
              "restaurant":{  },
              "tableid":12,
              "orderid":1,
              "total_amount":"0.00"
           },
           "article":{  
              "id":1,
              "category":{  },
              "ingredient":[  ],
              "articleoptionnames":{  },
              "restaurant":{  },
              "articlename":"Article1",
              "price":"1.90",
              "pickuptax":6,
              "dineintax":21,
              "description":"This is a tekst field with more information about the product",
              "image":"/media/Article/c1.264f3b28_sxcPiqi.png"
           }
        },

Хотя я хочу, чтобы эти "article_option" были дочерними по отношению к статье, например Article {article_option1, article_option2} , но при этом создавались новые объекты с каждым новым параметром article.

1 Ответ

1 голос
/ 22 октября 2019

Если я вас правильно понимаю, вы хотите вернуть представление OrderArticle, у которого ArticleOption объектов в качестве дочерних. Это означает, что вы должны создать экземпляр ArticlesSerializer в своем представлении, но также изменить ArticlesSerializer, чтобы он включал все связанные article_options в виде списка (используя атрибут source). Что-то вроде следующего:

class ArticlesOptionSerializer(serializers.ModelSerializer):
    article_option = ListCategoriesSerializer(read_only=True)

    class Meta:
        model = OrderArticleOptions
        fields = ['article_option', 'order_article', 'quantity', 'price']


class ArticlesSerializer(serializers.ModelSerializer):
    order = OrderSerializer(read_only=True)
    article = ListArticleSerializer(read_only=True)
    article_options = ArticlesOptionSerializer(read_only=True, source='orderarticleoptions_set', many=True)

    class Meta:
        model = OrderArticle
        fields = ['order', 'article', 'article_options']

Тогда, на ваш взгляд, вы должны создать экземпляр ArticlesSerializer с соответствующим OrderArticle объектом:

class OrderedArticles(APIView):
    def get(self, request, restid):
        order_article = OrderArticle.objects.get(pk=1) # get pk/id from request
        serializer = ArticlesSerializer(order_article)
        return Response(serializer.data, status=status.HTTP_200_OK)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...