即使我正在进行SELECT *,原始查询也必须包含主键错误

时间:2017-02-10 22:13:50

标签: python mysql django python-3.x django-models

根据https://docs.djangoproject.com/en/1.10/topics/db/sql/

我有

query = "SELECT * FROM model_name"
objs = []
for obj in models.ModelName.objects.raw(query):
    objs.append(obj)

但它抱怨Raw查询必须包含主键错误

为什么会发生这种情况

ModelName代码:

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

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

2 个答案:

答案 0 :(得分:1)

您确定要查询的是与“ModelName”模型相同的表格吗?

无论如何,指定'id'字段是多余的,因为它默认出现在所有django模型中。

答案 1 :(得分:0)

根据您的问题,您可能在表名中出现了问题。 Django表约定如下:

appname_modelname

所以说你有民意调查应用程序 和Poll模型类里面的 轮询/ models.py

class Poll(models.Model):
    title = models....

那么sql中的表名将是polls_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中尝试这个解决方案。只是为了确保你的primary_key是唯一的。

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)