Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.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 原始查询必须包含主键错误,即使I';我在做选择*_Python_Mysql_Django_Python 3.x_Django Models - Fatal编程技术网

Python 原始查询必须包含主键错误,即使I';我在做选择*

Python 原始查询必须包含主键错误,即使I';我在做选择*,python,mysql,django,python-3.x,django-models,Python,Mysql,Django,Python 3.x,Django Models,依照 我有 query = "SELECT * FROM model_name" objs = [] for obj in models.ModelName.objects.raw(query): objs.append(obj) 但它抱怨原始查询必须包含主键错误 为什么会这样 型号名称代码: class ModelName(ModelBase): fielda = models.CharField(max_length=255) class ModelBase(models

依照

我有

query = "SELECT * FROM model_name"
objs = []
for obj in models.ModelName.objects.raw(query):
    objs.append(obj)
但它抱怨原始查询必须包含主键错误

为什么会这样

型号名称代码:

class ModelName(ModelBase):
    fielda = models.CharField(max_length=255)

class ModelBase(models.Model):
    id = models.IntegerField(primary_key=True)

是否确实要查询与“ModelName”模型相同的表


无论如何,指定“id”字段是多余的,因为所有django型号都默认使用它。

根据您的问题,表名中可能有错误。 Django表惯例如下:

appname_modelname
所以说你有投票应用 并在其中轮询模型类 polls/models.py

class Poll(models.Model):
    title = models....
然后,sql中的表名将为polls\u poll

为了避免混淆,最好先显式导入模型

from polls.models import Poll

query = "SELECT * FROM polls_poll"
objs = []
for obj in Poll.objects.raw(query):
    objs.append(obj)
因此,在您的情况下,查询应该是

select * from MyApp_ModelName;
我认为对于主要的关键问题,如果你不打算使用像CharField“prod001”这样的东西,那么AutoField是一个不错的选择

否则,在您的模型中 在models.py内尝试此解决方案。只是为了确保您的主键是唯一的

from django.db.models.signals import pre_save

def add_id(instance, new_id=None):
    id = instance.id
    if new_id is not None:
        id = new_id
    checker = ModelName.objects.filter(id=instance.id).order_by("-id")
    exists = checker.exists()
    if exists:
        new_id = len(ModelName.objects.all()) + 1
        return add_id(instance, new_id=new_id)
    return id

def pre_save_post_receiver(sender, instance, *args, **kwargs):
    instance.id = add_id(instance)


pre_save.connect(pre_save_post_receiver, sender=ModelName)

不要使用原始查询。我没有发现ORM做不到的任何事情,我编写了一些复杂的查询。如果我在Django应用程序中看到这样的原始查询,我会认为开发人员不知道他们在做什么。