我正在尝试使用get_or_create方法来查看记录是否存在。如果记录存在,则什么都不做,否则创建它。
这个模型基本上用在失败的命令上
class modelStudentExamsPerformed(models.Model):
patient = models.ForeignKey(modelPatient)
student = models.ForeignKey(modelStudent,on_delete=models.CASCADE)
normalBodyPart = models.ForeignKey(modelNormalBodyPartResult,default=None,blank=True,null=True)
abnormalBodyPart = models.ForeignKey(modelAbnormalBodyPartResult,default=None,blank=True,null=True)
tool = models.CharField(max_length=128, default="")
Run Code Online (Sandbox Code Playgroud)
现在这是使用上述模型但失败的命令
exams.modelStudentExamsPerformed.objects.get_or_create()(patient=patient_qset, student=stud_qset,abnormalBodyPart=qset[0],normalBodyPart=None,date=None)
Run Code Online (Sandbox Code Playgroud)
上面的语句给了我错误:
get() returned more than one modelStudentExamsPerformed -- it returned 2!
Run Code Online (Sandbox Code Playgroud)
现在这是我遇到麻烦的地方。当我通过我的管理员查看数据库时,我确实注意到两个对象,但这些对象都有一个关联的值normalBodyPart并且它们abnormalBodyPart是空的。既然我明确指定并分配了一个值,abnormalBodyPart为什么 django 说两个项目已经存在?我希望这是有道理的 。
让我们以另一种方式解释这一点,假设有两个语句 1 和 2。语句 1 根据指定的参数获取或创建记录。这个 get 或 create 失败,因为 django 认为已经有两条记录。但是语句 2 使用相同的确切参数并返回 0 条记录。这是为什么 ?我在这里缺少什么和不理解?
声明 1:
exams.modelStudentExamsPerformed.objects.get_or_create()(patient=patient_qset, student=stud_qset,abnormalBodyPart=qset[0],normalBodyPart=None,date=None)
Run Code Online (Sandbox Code Playgroud)
当显然该表中的所有对象都没有 的值时abnormalBodyPart。我通过执行以下操作验证了这一点
声明 2:
k = exams.modelStudentExamsPerformed.objects.filter(patient=patient_qset, student=stud_qset,abnormalBodyPart=qset[0], normalBodyPart=None,date=None)
Run Code Online (Sandbox Code Playgroud)
上面的语句 2 …
我有“post”对象和一个“post like”对象,其中包含哪个用户收到了多少赞:
class Post(models.Model):
text = models.CharField(max_length=500, default ='')
user = models.ForeignKey(User)
class PostLike(models.Model):
user = models.ForeignKey(User)
post = models.ForeignKey(Post)
Run Code Online (Sandbox Code Playgroud)
我可以像这样选择帖子收到的赞数:
Post.objects.all().annotate(likes=Count('postlike'))
Run Code Online (Sandbox Code Playgroud)
这大致翻译为:
SELECT p.*,
Count(l.id) AS likes
FROM post p, postlike l
WHERE p.id = l.post_id
GROUP BY (p.id)
Run Code Online (Sandbox Code Playgroud)
有用。现在,我如何过滤Count当前用户的聚合?我想不检索所有岗位的喜欢,但都喜欢通过登录的用户。生成的 SQL 应该是这样的:
SELECT p.*,
(SELECT COUNT(*) FROM postlike WHERE postlike.user_id = 1 AND postlike.post_id = p.id) AS likes
FROM post p, postlike l
WHERE p.id = l.post_id
GROUP BY (p.id)
Run Code Online (Sandbox Code Playgroud) 我的项目有一个模型,如下所示:
class Data(Model):
data = FloatField(verbose_name='Data', null=True, blank=True)
created_at = DateTimeField(verbose_name='Created at')
Run Code Online (Sandbox Code Playgroud)
我的应用程序每天会创建数百个此模型的日志。
我试图只对每天的最大值求和,而不必遍历它们(仅使用 Django 查询)。
是否可以不编写 SQL 查询?
PS:我能够获得每天最大的“数据”,因此当前的逻辑会迭代几天并总结每天的最大值。但是该解决方案变得太慢了,我想直接将其解决到 db 级别。
我在我的项目中使用了 postgresql 数据库,我使用了 django文档中的以下示例。
from django.db.models import OuterRef, Subquery
newest = Comment.objects.filter(post=OuterRef('pk')).order_by('-created_at')
Post.objects.annotate(newest_commenter_email=Subquery(newest.values('email')[:1]))
Run Code Online (Sandbox Code Playgroud)
但不是最新的评论者电子邮件,我需要最后两封评论者的电子邮件。我改变了[:1]对[:2],但此异常引发:ProgrammingError: more than one row returned by a subquery used as an expression。
django django-orm django-postgresql django-annotate django-subquery
我在 django 项目中使用 postgresql 数据库。
我的项目中有多个应用程序。
users/
UserProfile model
myapp/
CustomModel model
Run Code Online (Sandbox Code Playgroud)
现在我需要在模式UserProfile中创建表public并且CustomModel需要在名为的单独模式中创建表myapp
如何实现这个以及实现这个之后我将来是否需要更改查询或迁移命令中的任何内容?
如何在 Django ORM 中使用正则表达式?我找到了__searchand__contains字段的后缀,但__regexp不起作用。
解决方案是使用__regex而不是__regexp如果有人遇到同样的问题。
如何使用字段长度排序
结果如下:
Model.objects.all().order_by(len("field"))
Run Code Online (Sandbox Code Playgroud)
SQL:
select * from table order by len(field)
Run Code Online (Sandbox Code Playgroud) 我有一个查询,如下所示,该查询返回特定课程(学年)中特定学期(学期)中特定班级的所有学生的成绩:
grades = Grade.objects.filter(term='First', student__in_class=1,session=1).order_by('-total')
Run Code Online (Sandbox Code Playgroud)
然后是另一个对成绩进行注释的查询,以获取“总计”字段的总和。
grades_ordered = grades.values('student')\
.annotate(total_mark=Sum('total')) \
.order_by('-total_mark')
Run Code Online (Sandbox Code Playgroud)
最初,一切正常,直到我从使用SQLite迁移到PostgreSQL时,以下错误开始出现。
错误:
function sum(character varying) does not exist
LINE 1: SELECT "sms_grade"."student_id", SUM("sms_grade"."total") AS...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)
编辑:这是我的模型
class Grade(models.Model):
session = models.ForeignKey(Session, on_delete=models.CASCADE)
term = models.CharField(choices=TERM, max_length=7)
student = models.ForeignKey(Student, on_delete=models.CASCADE)
subject = models.ForeignKey(Subject, on_delete=models.CASCADE)
fca = models.CharField(max_length=10)
sca = models.CharField(max_length=10)
exam = models.CharField(max_length=10)
total = models.CharField(max_length=3, blank=True, null=True)
grade = …Run Code Online (Sandbox Code Playgroud) django postgresql django-orm django-database django-annotate