【问题标题】:How to create a graphql mutation with a relation in Django如何在 Django 中创建具有关系的 graphql 突变
【发布时间】:2022-08-04 07:36:02
【问题描述】:

我在 graphql 中创建包含关系的突变时遇到问题。我不知道从哪里开始。

例如 - 三类模型:

class HotelGuests(models.Model):
    id = models.UUIDField(primary_key=True,
                          default=uuid.uuid4,
                          editable=False)
    name = models.CharField(max_length=46, default=\'noname\')
    lastname = models.CharField(max_length=46, default=\'noname\')
    email = models.EmailField(max_length=254)
    tel_number = models.CharField(max_length=12, blank=True, null=True)

class Rooms(models.Model):
    room_number = models.PositiveSmallIntegerField()
    min_vacancy = models.PositiveSmallIntegerField(default=1)
    max_vacancy = models.PositiveSmallIntegerField(default=7)


class Reservations(models.Model):
    BOOKING_STATUS = {
        (0, \'Do zatwierdzenia\'),
        (1, \'Zatwierdzona\'),
        (2, \'Zrealizowana\'),
        (3, \'Anulowana\'),
    }

    price = models.FloatField(default=0)
    prepayment_price = models.FloatField(default=0, blank=True, null=True)
    number_of_guests = models.PositiveSmallIntegerField()
    date_from = models.DateField(default=now)
    date_to = models.DateField(default=now)
    description = models.TextField(blank=True, null=True)
    booking_status = models.PositiveSmallIntegerField(default=0, choices=BOOKING_STATUS)

    hotel_guest = models.ForeignKey(HotelGuests, on_delete=models.CASCADE)
    room = models.ForeignKey(Rooms, on_delete=models.SET_NULL, blank=True, null=True)

三类graphql类型:

class HotelGuestType(DjangoObjectType):
    class Meta:
        model = HotelGuests
        fields = (\'id\', \'name\', \'lastname\', \'email\', \'tel_number\')


class RoomType(DjangoObjectType):
    class Meta:
        model = Rooms
        fields = (\'id\', \'room_number\', \'min_vacancy\', \'max_vacancy\')


class ReservationType(DjangoObjectType):
    class Meta:
        model = Reservations
        fields = (\'id\',
                  \'price\',
                  \'prepayment_price\',
                  \'number_of_guests\',
                  \'date_from\',
                  \'date_to\',
                  \'description\',
                  \'booking_status\',
                  \'hotel_guest\',
                  \'room\',)

和三类节点:

class HotelGuestNode(DjangoObjectType):
    class Meta:
        model = HotelGuests
        filter_fields = [\'id\',
                         \'name\',
                         \'lastname\',
                         \'email\',
                         \'tel_number\']
        interfaces = (relay.Node, )


class RoomNode(DjangoObjectType):
    class Meta:
        model = Rooms
        filter_fields = [\'id\',
                         \'room_number\',
                         \'min_vacancy\',
                         \'max_vacancy\']
        interfaces = (relay.Node, )


class ReservationNode(DjangoObjectType):

    in_room = relay.ConnectionField(RoomNode, description=\'InRoom\')
    booked_by = relay.ConnectionField(HotelGuestNode, description=\'BookedBy\')

    @resolve_only_args
    def resolve_in_room(self):
        return self.in_room.all()

    class Meta:
        model = Reservations
        filter_fields = [\'id\',
                         \'price\',
                         \'prepayment_price\',
                         \'number_of_guests\',
                         \'date_from\',
                         \'date_to\',
                         \'description\',
                         \'booking_status\']
        interfaces = (relay.Node,)

我怎么能从中做出一个突变,在其中我将创建一个连接到酒店客人和房间的预订对象?

    标签: python django django-models graphql graphene-django


    【解决方案1】:

    当您在 Reservations 模型中声明您的 hotel_guest 和 room 字段时,您可以像这样创建一个 related_name:

    hotel_guest = models.ForeignKey(HotelGuests, on_delete=models.CASCADE, related_name="hotel_reservation")
    room = models.ForeignKey(Rooms, on_delete=models.SET_NULL, blank=True, null=True, related_name="hotel_room")
    

    然后,您可以使用各自的相关名称在您的 HotelGuestType 或 RoomType 中访问它。

    这允许您在查询中使用它们

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 2018-06-20
      • 2019-01-31
      • 2019-07-26
      • 2018-07-08
      • 1970-01-01
      • 2018-09-19
      • 2017-10-09
      • 2019-10-30
      相关资源
      最近更新 更多