Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django graphene alter列名不推荐_Python_Django_Graphene Python - Fatal编程技术网

Python django graphene alter列名不推荐

Python django graphene alter列名不推荐,python,django,graphene-python,Python,Django,Graphene Python,我想更改数据库表中的列名,弃用django graphene中的旧字段,并添加新字段 在Django模型中,如果不创建两次相同的列,我如何或可以做到这一点?在执行此操作时,我可以避免系统检查期间出现错误,但仍然会在测试中遇到错误 模型 模式 class MyNode(DjangoObjectType): mycolumn = String(deprecation_reason='Deprecated') 背景 SILENCED_SYSTEM_CHECKS = ['models.E007

我想更改数据库表中的列名,弃用django graphene中的旧字段,并添加新字段

在Django模型中,如果不创建两次相同的列,我如何或可以做到这一点?在执行此操作时,我可以避免系统检查期间出现错误,但仍然会在测试中遇到错误

模型

模式

class MyNode(DjangoObjectType):
    mycolumn = String(deprecation_reason='Deprecated')
背景

SILENCED_SYSTEM_CHECKS = ['models.E007']
不过,这是可行的,现在我尝试运行测试,在其中创建一个示例
MyModel
factory实例

class TestMyModel(TestModelBase):
    def setUp(self):
        self.my_model = MyModel(my_model_nm='Some model')
当然,这会引发一个异常

django.db.utils.ProgrammingError: column "my_column" specified more than once
我似乎做错了这件事。如何更改django graphene中的字段名,弃用旧名称,并使新字段引用表中的同一列

石墨烯==1.2

石墨烯django==1.2.1


graphqlcore==1.0.1

以下是我们最终要做的事情

from graphene import String
from graphene_django.converter import convert_django_field


class AliasCharField(models.Field):
    """
    Alias for a CharField so that two fields may point to the same column.
    source: https://djangosnippets.org/snippets/10440/
    """
    def contribute_to_class(self, cls, name, virtual_only=False):
        super(AliasCharField, self).contribute_to_class(cls, name,
                                                        virtual_only=True)
        setattr(cls, name, self)

    def __get__(self, instance, instance_type=None):
        return getattr(instance, self.db_column)


@convert_django_field.register(AliasCharField)
def convert_alias_char_field_to_string(field, registry=None):
    """
    Tell graphene-django how to deal with AliasCharField.
    source: https://github.com/graphql-python/graphene-django/issues/303
    """
    depr_reason = getattr(field, 'deprecation_reason', None)
    return String(description=field.help_text,
                  deprecation_reason=depr_reason,
                  required=not field.null)


class MyModel(BaseModel):
    my_column = models.CharField(
        max_length=255, blank=True, null=True)
    mycolumn = models.CharField(
        max_length=255, blank=True, null=True
        db_column='my_column')
    my_column.deprecation_reason = 'Deprecated'

这可以在不抑制系统签入设置的情况下工作。

您是否正在尝试更改Django模型中的字段名,仅在graphene API中更改,还是同时在graphene API中更改?两者都是理想的,但具体在API中。您是否尝试过为模型列更改创建迁移以首先重命名它?迁移与此无关,但它毕竟是一个非托管表。啊,好吧——我想在看到您的解决方案之前,我不理解您的问题:-)
from graphene import String
from graphene_django.converter import convert_django_field


class AliasCharField(models.Field):
    """
    Alias for a CharField so that two fields may point to the same column.
    source: https://djangosnippets.org/snippets/10440/
    """
    def contribute_to_class(self, cls, name, virtual_only=False):
        super(AliasCharField, self).contribute_to_class(cls, name,
                                                        virtual_only=True)
        setattr(cls, name, self)

    def __get__(self, instance, instance_type=None):
        return getattr(instance, self.db_column)


@convert_django_field.register(AliasCharField)
def convert_alias_char_field_to_string(field, registry=None):
    """
    Tell graphene-django how to deal with AliasCharField.
    source: https://github.com/graphql-python/graphene-django/issues/303
    """
    depr_reason = getattr(field, 'deprecation_reason', None)
    return String(description=field.help_text,
                  deprecation_reason=depr_reason,
                  required=not field.null)


class MyModel(BaseModel):
    my_column = models.CharField(
        max_length=255, blank=True, null=True)
    mycolumn = models.CharField(
        max_length=255, blank=True, null=True
        db_column='my_column')
    my_column.deprecation_reason = 'Deprecated'