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应用程序中看到这样的原始查询,我会认为开发人员不知道他们在做什么。