2017-02-10 19 views
0

按照https://docs.djangoproject.com/en/1.10/topics/db/sql/原始查询必须包括主键错误,即使我做SELECT *

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) 
+0

请勿使用原始查询。我还没有发现ORM不能做的一件事,而且我写了一些复杂的查询。如果我在Django应用程序中看到类似的原始查询,我会认为开发人员不知道他们在做什么。 – kagronick

回答

0

根据你的问题,很可能你的表名有错误。 Django的表约定如下:

appname_modelname 

所以说,你有投票应用 和投票模型类里面它 民调/ 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) 
1

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

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

相关问题