Мне интересно, как правильно реализовать мутацию, которая включает 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()
Спасибо за любую помощь!