根据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)
答案 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)