Сериализаторы во внешнем ключе Django - PullRequest
0 голосов
/ 18 сентября 2018

Мне нужно получить информацию из Reservation, ReservationDetails и Product, но просто получить Reservation и ReservationDetails

У меня есть 3 модели

class Reservation(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    userReservation = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
    dateStart = models.DateTimeField(null=False, blank=False, default=datetime.now)
    dateFinish = models.DateTimeField(null=False, blank=False, default=datetime.now)
    date_Created = models.DateTimeField(auto_now_add=True)
    date_Modified = models.DateTimeField(auto_now=True, db_index=True)

    def __str__(self):
        return str(self.id)


class DetailsReservation(models.Model):
    Reservation = models.ForeignKey(Reservation, blank=False, on_delete=models.CASCADE, null=True, related_name='reservation_details')
    product = models.ForeignKey(Product, blank=False, on_delete=models.CASCADE, null=True, related_name='products_reservation')
    Quantity = models.IntegerField(null=False, blank=False, default=0)
    userbyReserva = models.ForeignKey(User, editable=False, on_delete=models.CASCADE, default=1)

class Product(models.Model):
    product_Description = models.CharField(max_length=255)
    Quantity = models.IntegerField(null=False, blank=False, default=0)
    Quantity_Max_Reservation = models.IntegerField(null=False, blank=False, default=0)
    product_Comments = models.CharField(max_length=255)
    size = models.CharField(max_length=10, null=True)
    product_Status = models.BooleanField(default=True)
    category = models.ForeignKey(Category,  on_delete=models.CASCADE, null=True, related_name='products')
    date_Created = models.DateTimeField(default=datetime.now, blank=True)
    date_Modified = models.DateTimeField(default=datetime.now, blank=True)

И я попытался создать сериализаторы

class ReservationDetailsSerializers(serializers.ModelSerializer):
    products = serializers.PrimaryKeyRelatedField(queryset=Product.objects.all(), required=False)
    class Meta:
        model= DetailsReservation
        fields =  ['Reservation', 'Quantity', 'userbyReserva', 'products']


class ReservationDetailsListSerializer(serializers.ModelSerializer):
    reservation_details = ReservationDetailsSerializers(many=True)
    class Meta:
        model = Reservation
        fields = ['id', 'userReservation', 'dateStart', 'dateFinish', 'reservation_details']

но в ответе это поле не отображается

[
    {
        "id": "6d87ba1c-61bc-41bd-80c8-31a51df8d32f",
        "userReservation": 1,
        "dateStart": "2018-09-16T17:19:34-05:00",
        "dateFinish": "2018-09-16T17:19:35-05:00",
        "reservation_details": [
            {
                "Reservation": "6d87ba1c-61bc-41bd-80c8-31a51df8d32f",
                "Quantity": 1,
                "userbyReserva": 1
                >>"here should show this information product"
            }
        ]
    },
    {
        "id": "0ed26395-2579-4c40-9a63-460f5095ac51",
        "userReservation": 2,
        "dateStart": "2018-09-16T19:21:24-05:00",
        "dateFinish": "2018-09-16T19:21:24-05:00",
        "reservation_details": [
            {
                "Reservation": "0ed26395-2579-4c40-9a63-460f5095ac51",
                "Quantity": 1,
                "userbyReserva": 2
            }
        ]
    }
]

, и это мои views.py

class getAllReservationDetails(generics.ListCreateAPIView):

    queryset = Reservation.objects.prefetch_related('reservation_details')
    print(queryset.query)
    serializer_class = ReservationDetailsListSerializer
    def get_object(self):
        queryset = self.queryset()
        obj = get_object_or_404(queryset)
        return obj

Я рассматриваю это Ссылка , ноя не знаю, почему не показывает информационный продукт.

Но это не работает, как я хотел.

Что мне делать?

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Вы пытались создать сериализатор для модели Продукта и использовать его на ReservationDetailsSerializer?

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__'

class ReservationDetailsSerializers(serializers.ModelSerializer):
    products = ProductSerializer(source='product', required=False)
    class Meta:
        model= DetailsReservation
        fields =  ['Reservation', 'Quantity', 'userbyReserva', 'products']

Подробнее об этом можно узнать в Указание вложенной сериализации

0 голосов
/ 18 сентября 2018

Модель DetailsReservation не имеет атрибута products, но имеет product.

Так что удалите " s"от products или используйте source = 'product' in ReservationDetailsSerializers сериализатор


Метод - 1 : удаление " s "

class ReservationDetailsSerializers(serializers.ModelSerializer):
    <b>product</b> = serializers.PrimaryKeyRelatedField(queryset=Product.objects.all(), required=False)
    class Meta:
        model= DetailsReservation
        fields =  ['Reservation', 'Quantity', 'userbyReserva', <b>'product'</b>]



Метод - 2 : указание source аргумент

class ReservationDetailsSerializers(serializers.ModelSerializer):
    products = serializers.PrimaryKeyRelatedField(queryset=Product.objects.all(),
                                                  required=False, <b>source='product'</b>)

    class Meta:
        model = DetailsReservation
        fields = ['Reservation', 'Quantity', 'userbyReserva', 'products']


UPDATE

Я думаю, вам нужно представление вложенного сериализатора . Если это так, вам нужно определить отдельный сериализатор (скажем, ProductSerializer) и добавить его к ReservationDetailsSerializers вместо serializers.PrimaryKeyRelatedField()

#new serializer class
class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__' # you can specify the fields here

Следовательно Метод-1 становится

class ReservationDetailsSerializers(serializers.ModelSerializer):
    product = ProductSerializer(required=False)
    class Meta:
        model= DetailsReservation
        fields =  ['Reservation', 'Quantity', 'userbyReserva', 'product']

и Method-2 становятся

class ReservationDetailsSerializers(serializers.ModelSerializer):
    products = ProductSerializer(required=False, source='product')</p>

    class Meta:
        model = DetailsReservation
        fields = ['Reservation', 'Quantity', 'userbyReserva', 'products']
...