Мутация чужеродного поля в графене Django (реле) - PullRequest
0 голосов
/ 03 февраля 2020

Мне интересно, как правильно реализовать мутацию, которая включает ForeignKey?

Извините за длинный пост, но я действительно хочу объяснить все как можно более подробно

Давайте представим, что у нас есть эти модели класса FuelType (models.Model):

  code = models.CharField(max_length=64, help_text='Fuel Type. Diesel | Benzing | Gas | Spiritus, etc. Short code for it')
  # code = models.CharField(max_length=64, choices=TYPES.choices, default=TYPES.DIESEL, help_text='Fuel Type. Diesel | Benzing | Gas | Spiritus, etc. Short code for it')

  label = models.CharField(max_length=256, help_text='A human readable label of the fuel type.')
  # fuel_type = models.CharField(choices=FUEL_TYPES, default=0)

  def __str__(self):
    return self.label

  class Meta:
    ordering = ['id']



class FuelSubType(models.Model):
  fuel_type = models.ForeignKey('FuelType', on_delete=models.CASCADE, help_text='A fuel subtype. Eg, benzin Extra | 95 | 92, etc.')

  label = models.CharField(max_length=256, help_text='A human readable label of the fuel subtype type.')

  def __str__(self):
    return self.label

Я хочу создать обычную графическую мутацию FuelSubType, и мне интересно, как лучше всего реализовать ее в случай ForeignField

class FuelTypeNode(DjangoObjectType):
  class Meta:
    model = FuelType

    # a custom Filter
    filterset_class = FuleTypeFilter
    interfaces = (relay.Node, )


class CreateFuelType(relay.ClientIDMutation):

  class Input:
    # The input arguments for this mutation
    code = String(required=True)
    label = String(required=True)

  ok = graphene.Boolean()

  # The class attributes define the response of the mutation
  fuel_type = Field(FuelTypeNode)

  def mutate_and_get_payload(root, info, input):
    code = input['code']
    label = input['label']

    fuel_type = FuelType(code=code, label=label)
    ok = True
    return CreateFuelType(fuel_type=fuel_type, ok=ok)


# --- ! Fuel Type ---


# --- Fuel SubType ---
class FuelSubTypeNode(DjangoObjectType):
  class Meta:
    model = FuelSubType
    filter_fields = {
      'fuel_type__code': ['exact', 'icontains', 'istartswith'],
      'fuel_type__label': ['exact', 'icontains', 'istartswith'],
      'label': ['exact', 'icontains', 'istartswith'],
    }

    interfaces = (relay.Node, )

Как правильно реализовать создание FuelSubType?

Как возможное решение, мы можем предоставить простой идентификатор FuelType в виде строки и вручную получите FuelType в нашем mutate_and_getpayload для примера.

class CreateFuelSubType(relay.ClientIDMutation):
  class Input:
    label = String(required=True)
    fuel_type_id = String(required=True)

  fuel_subtype = Field(FuelSubTypeNode)
  ok = graphene.Boolean()

  def mutate_and_get_payload(root, info, input):
    label = input['label']
    fuel_type = FuelType.objects.get(id=input['fuel_type_id'])

    fuel_subtype = FuelSubType(label=label, fuel_type=fuel_type)
    ok = True
    return CreateFuelSubType(fuel_subtype=fuel_subtype, ok=ok)

Но есть ли возможность реализовать его немного более динамично c? Я имею в виду, что передача простой строки не означает, что существует какая-то внешняя связь, et c. Я хотел бы упомянуть это как-то. В документах я нашел InputObjectType , который позволяет нам создавать входные данные запроса, но в этом случае я должен пропустить все поля, определенные в этих входных данных. Например, не только удостоверение личности, но и ярлык (

class FuelTypeInput(graphene.InputObjectType):
    label = graphene.String()
    code = graphene.String()

Спасибо за любую помощь!

...