我很好奇是否有任何方法可以在Django中进行查询而不是SELECT * FROM...
"下面的".我正在尝试做一个" SELECT DISTINCT columnName FROM ...
".
具体来说,我有一个模型,看起来像:
class ProductOrder(models.Model):
Product = models.CharField(max_length=20, promary_key=True)
Category = models.CharField(max_length=30)
Rank = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
其中Rank
是一个排名Category
.我希望能够遍历所有类别,对该类别中的每个等级进行一些操作.
我想首先获得系统中所有类别的列表,然后查询该类别中的所有产品并重复,直到处理完每个类别.
我宁愿避免使用原始SQL,但如果我必须去那里,那就没事了.虽然我以前从来没有在Django/Python中编写原始SQL.
我是Django的新手,但在编程方面经验丰富.我有一组的,我想组到部分应用程序,但无法弄清楚如何让manage.py为我做这个相关的应用.
理想情况下,我最终会得到如下结构:
project/
app/
subapp1/
subapp2/
Run Code Online (Sandbox Code Playgroud)
我试过manage.py startapp app.subapp1
和manage.py startapp app/subapp1
,但是这告诉我,/
和.
无效字符的应用程序的名称.
我已经尝试更改到app目录并运行,../manage.py subapp1
但这使supapp1处于顶层.注意,我不是要直接制作一个独立的应用程序.我正试图在一个项目中做所有这些.
我一直在寻找一种创建只读表单字段的方法,我在这个主题上发现的每篇文章都附带一个声明"这是一个坏主意".现在对于单个表单,我可以理解还有其他方法可以解决问题,但在modelformset中使用只读表单字段似乎是一个完全自然的想法.
考虑一个教师成绩簿应用程序,老师希望能够通过一个SUBMIT输入所有学生(注意复数学生)成绩.modelformset可以迭代所有学生成绩,学生姓名是只读的,成绩是可编辑的字段.我喜欢使用modelformset获得的错误检查和错误报告的强大功能和便利性,但是让学生名称在这样的表单中可编辑是疯狂的.
由于专家django的共识是只读表单字段是一个坏主意,我想知道上面的示例学生级示例的标准django最佳实践是什么?
我希望能够在modelformset_factory中使用自定义表单.例如:
models.py
class Author(models.Model):
name = models.CharField()
address = models.CharField()
class AuthorForm(ModelForm):
class Meta:
model = Author
Run Code Online (Sandbox Code Playgroud)
views.py
def test_render(request):
myModelFormset = modelformset_factory(Author)
items = Author.objects.all()
formsetInstance = myModelFormset(queryset = items)
return render_to_response('template',locals())
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常,但请注意我没有使用AuthorForm.问题是如何让modelformset_factory使用AuthorForm(我计划稍后自定义)而不是制作默认的Author表单?
我有兴趣在帮助页面中显示我的代码的版本号.理想情况下,我会使用Major.Minor.SVNrevision格式,其中自动提取SVNrevision编号.我希望?怀疑我可以访问某个地方的变量,但不知道它可能是什么.
任何提示?
我正在编写测试应用程序的问题,我正在编写以验证一些Django功能.测试应用程序是一个小型的"等级书"应用程序,目前正在使用Alex Gaynor的只读字段功能http://lazypython.blogspot.com/2008/12/building-read-only-field-in-django.html
有两个问题可能是相关的.首先,当我在下面的这2行中翻转评论时:
# myform = GradeForm(data=request.POST, instance=mygrade)
myform = GradeROForm(data=request.POST, instance=mygrade)
Run Code Online (Sandbox Code Playgroud)
它的工作方式与我预期的一样,当然除了学生领域是可变的.
当评论以显示的方式显示时,"studentId"字段显示为数字(不是名称,问题1),当我点击提交时,我收到一条错误,指出studentId需要是Student实例.
我不知道如何解决这个问题.我并不喜欢Alex Gaynor的代码.任何代码都可以.我对Python和Django都比较陌生,所以我在网站上看到的"让一个只读字段变得容易"的提示仍然超出我的范围.
// models.py
class Student(models.Model):
name = models.CharField(max_length=50)
parent = models.CharField(max_length=50)
def __unicode__(self):
return self.name
class Grade(models.Model):
studentId = models.ForeignKey(Student)
finalGrade = models.CharField(max_length=3)
# testbed.grades.readonly is alex gaynor's code
from testbed.grades.readonly import ReadOnlyField
class GradeROForm(ModelForm):
studentId = ReadOnlyField()
class Meta:
model=Grade
class GradeForm(ModelForm):
class Meta:
model=Grade
Run Code Online (Sandbox Code Playgroud)
// views.py
def modifyGrade(request,student):
student = Student.objects.get(name=student)
mygrade = Grade.objects.get(studentId=student)
if request.method == "POST":
# myform = GradeForm(data=request.POST, …
Run Code Online (Sandbox Code Playgroud) 我正在写一本测试"成绩簿"应用程序.models.py文件如下所示.
class Student(models.Model):
name = models.CharField(max_length=50)
parent = models.CharField(max_length=50)
def __unicode__(self):
return self.name
class Grade(models.Model):
studentId = models.ForeignKey(Student)
finalGrade = models.CharField(max_length=3)
Run Code Online (Sandbox Code Playgroud)
我希望能够在一个模型中改变几个学生的最终成绩,但现在我只是尝试一个学生.我也试图为它创建一个表单,将学生姓名显示为一个无法更改的字段,这里唯一可以更改的是finalGrade.所以我用这个技巧让studentId只读.
class GradeROForm(ModelForm):
studentId = forms.ModelChoiceField(queryset=Student.objects.all())
def __init__(self, *args, **kwargs):
super(GradeROForm,self).__init__(*args, **kwargs)
instance = getattr(self, 'instance', None)
if instance and instance.id:
self.fields['studentId'].widget.attrs['disabled']='disabled'
def clean_studentId(self):
instance = getattr(self,'instance',None)
if instance:
return instance.studentId
else:
return self.cleaned_data.get('studentId',None)
class Meta:
model=Grade
Run Code Online (Sandbox Code Playgroud)
以下是我的看法:
def modifyGrade(request,student):
student = Student.objects.get(name=student)
mygrade = Grade.objects.get(studentId=student)
if request.method == "POST":
myform = GradeROForm(data=request.POST, instance=mygrade)
if myform.is_valid():
grade = myform.save() …
Run Code Online (Sandbox Code Playgroud) 我正在使用模型来仅显示模型中的字段的子集.提交表单时,form.is_valid()失败,但form.errors为空.我不想在这里显示我的所有代码,但下面是一个示例:
模型和形式
class Videofiles(models.Model):
active = models.CharField(max_length=9)
filenamebase = models.CharField(max_length=180, primary_key=True, db_column='FilenameBase')
program = models.CharField(max_length=60, db_column='Program')
displayname = models.CharField(max_length=150, db_column='DisplayName')
description = models.TextField(db_column='Description', blank=True)
tagskeywords = models.TextField(db_column='TagsKeywords', blank=True)
class Meta:
db_table = u'legacyTable'
class VideoFilesForm(ModelForm):
filenamebase = forms.CharField(max_length=30)
displayname = forms.CharField(max_length=30)
description = forms.CharField(max_length=30, required=False)
tagskeywords = forms.CharField(max_length=60, required=False)
class Meta:
model=Videofiles
fields=['filenamebase','displayname','description','tagskeywords']
Run Code Online (Sandbox Code Playgroud)
视图
def editClip(request, clipId):
clip = Videofiles.objects.get(filenamebase=clipId)
form = VideoFilesForm(instance=clip)
if request.method == 'POST':
if 'save' in request.POST:
if form.is_valid():
form.save()
else:
print form.errors
return render_to_response('legacyDB/edit_clip.html',locals())
Run Code Online (Sandbox Code Playgroud)