графен-питон не распознает поле типа содержимого - PullRequest
0 голосов
/ 31 марта 2019

Я делаю свою первую попытку использовать «graphen-python », и до сих пор мне удалось заставить его работать, но я обнаружил, что «graphene-python» не распознает ForeignKey поля, которые ссылаются на ContentType модель.

Это моя модель:

class ReservationComponent(models.Model):
    reservation = models.ForeignKey(Reservation, on_delete=models.PROTECT, related_name='components', verbose_name=_("Reservation"))
    dertour_bk = models.CharField(null=True, blank=True, max_length=15, verbose_name=_("Dertour Bk"))
    day = models.DateField(verbose_name=_('Day'))
    content_type = models.ForeignKey(ContentType, on_delete=models.PROTECT)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    comment = models.TextField(null=True, blank=True, verbose_name=_("Comment"))
    is_invoiced = models.BooleanField(default=False, verbose_name=_("Is Invoiced"))

Это моя schemas.py :

import graphene
from graphene_django.types import DjangoObjectType
from ReservationsManagerApp.models import Reservation, ReservationComponent
from InvoicesManagerApp.models import Invoice, InvoiceEntry, InvoiceEntryComponent
from PaymentsManagerApp.models import Payment, PaymentReservationComponent

class ReservationType(DjangoObjectType):
    class Meta:
        model = Reservation

class ReservationComponentType(DjangoObjectType):
    class Meta:
        model = ReservationComponent

class InvoiceType(DjangoObjectType):
    class Meta:
        model = Invoice

class InvoiceEntryType(DjangoObjectType):
    class Meta:
        model = InvoiceEntry

class InvoiceEntryComponentType(DjangoObjectType):
    class Meta:
        model = InvoiceEntryComponent

class PaymentType(DjangoObjectType):
    class Meta:
        model = Payment

class PaymentReservationComponentType(DjangoObjectType):
    class Meta:
        model = PaymentReservationComponent

class  Query(object):
    all_reservations = graphene.List(ReservationType)
    all_reservation_components = graphene.List(ReservationComponentType)
    all_invoices = graphene.List(InvoiceType)
    all_invoice_components = graphene.List(InvoiceEntryType)
    all_invoice_entries_components = graphene.List(InvoiceEntryComponentType)
    all_payment = graphene.List(PaymentType)
    all_payment_reservation_components = graphene.List(PaymentReservationComponentType)

    def resolve_all_reservations(self, info, **kwargs):
        return Reservation.objects.all()

    def resolve_all_reservation_components(self, info, **kwargs):
        return ReservationComponent.objects.select_related('reservation').all()

    def resolve_all_invoice_entries_components(self, info, **kwargs):
        return InvoiceEntryComponent.objects.select_related('reservation_component').all()

    def resolve_all_payment_reservation_components(self, info, **kwargs):
        return PaymentReservationComponent.objects.select_related('reservation_component').all()

И на этом изображении вы можете видеть, что поле «content_type» модели «ReservationComponent» не принимается графен-питоном , даже если оно существует в модели.

enter image description here

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

1 Ответ

0 голосов
/ 24 апреля 2019

Это потому, что у вас нет DjangoObjectType для модели ContentType Джанго.

Вы можете создать его,

from graphene_django import DjangoObjectType
from django.contrib.contenttypes.models import ContentType

class ContentObjectType(DjangoObjectType):

    class Meta:
        model = ContentType

Согласно документации , вы должны создать тип для каждой подклассы моделей DjangoObjectType

...