Django ORM是否支持SQL IN运算符?就像是:
SELECT *
FROM user
WHERE id IN (1, 5, 34, 567, 229)
Run Code Online (Sandbox Code Playgroud)
如何使用Django ORM进行类似的查询?
谢谢.
我有以下型号:
class Volunteer(models.Model):
first_name = models.CharField(max_length=50L)
last_name = models.CharField(max_length=50L)
email = models.CharField(max_length=50L)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
class Department(models.Model):
name = models.CharField(max_length=50L, unique=True)
overseer = models.ForeignKey(Volunteer, blank=True, null=True)
location = models.CharField(max_length=100L, null=True)
class DepartmentVolunteer(models.Model):
volunteer = models.ForeignKey(Volunteer)
department = models.ForeignKey(Department)
assistant = models.BooleanField(default=False)
keyman = models.BooleanField(default=False)
captain = models.BooleanField(default=False)
location = models.CharField(max_length=100L, blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
我想查询没有志愿者分配给他们的所有部门.我可以使用以下查询执行此操作:
SELECT
vsp_department.name
FROM
vsp_department
LEFT JOIN vsp_departmentvolunteer ON vsp_department.id = vsp_departmentvolunteer.department_id
WHERE
vsp_departmentvolunteer.department_id IS NULL;
Run Code Online (Sandbox Code Playgroud)
是否有更像django的方式这样做或者我应该使用原始sql?
我有以下型号:
class User(models.Model):
name = models.Charfield()
email = models.EmailField()
class Friendship(models.Model):
from_friend = models.ForeignKey(User)
to_friend = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)
这些模型用于以下视图和序列化程序:
class GetAllUsers(generics.ListAPIView):
authentication_classes = (SessionAuthentication, TokenAuthentication)
permission_classes = (permissions.IsAuthenticated,)
serializer_class = GetAllUsersSerializer
model = User
def get_queryset(self):
return User.objects.all()
class GetAllUsersSerializer(serializers.ModelSerializer):
is_friend_already = serializers.SerializerMethodField('get_is_friend_already')
class Meta:
model = User
fields = ('id', 'name', 'email', 'is_friend_already',)
def get_is_friend_already(self, obj):
request = self.context.get('request', None)
if request.user != obj and Friendship.objects.filter(from_friend = user):
return True
else:
return False
Run Code Online (Sandbox Code Playgroud)
所以基本上,对于GetAllUsers视图返回的每个用户,我想打印出用户是否是请求者的朋友(实际上我应该检查from_和to_friend,但对于问题并不重要)
我看到的是,对于数据库中的N个用户,有1个查询用于获取所有N个用户,然后在序列化程序中查询1xN个查询 get_is_friend_already
有没有办法在休息框架方式中避免这种情况?也许是将select_related …
python django-orm django-queryset django-select-related django-rest-framework
我是Django的新手,没有找到关于这个问题的任何参考.当我在django模型(models.py)中使用多对多字段时,我收到此错误.我想问题是从窗体(forms.py)中查看视图(views.py)中的m2m.如何在视图中分配m2m字段.
Django版本2.O python 3.5
models.py
class User(AbstractUser):
username=models.CharField(max_length=20)
email = models.EmailField(_('email address'), unique=True)
class Setupuser(models.Model):
organization=models.CharField(max_length=200,blank=False,null=True)
emails_for_help = models.ManyToManyField(User)
Run Code Online (Sandbox Code Playgroud)
views.py
class Set_user(FormView):
template_name="pkm_templates/set_up_user.html"
form_class = Set_User_Form
success_url = '/thanks/'
def form_valid(self, form):
org = form.cleaned_data.get('organization')
emails = form.cleaned_data.get("emails_for_help")
instance = Setupuser(organization=org,emails_for_help=emails)
instance.save()
return redirect("/")
Run Code Online (Sandbox Code Playgroud)
forms.py
class Set_User_Form(ModelForm):
emails_for_help =
forms.ModelMultipleChoiceField(queryset=User.objects.all(),
widget=forms.CheckboxSelectMultiple)
class Meta:
model=Setupuser
fields=["organization","emails_for_help"]
Run Code Online (Sandbox Code Playgroud) 我有一个用Django构建的Q&A类型的网站,其中包含以下模型:
class Question(models.Model):
title = models.CharField(max_length=70)
details = models.TextField()
class Answer(models.Model):
question_id = IntegerField()
details = models.TextField()
Run Code Online (Sandbox Code Playgroud)
我需要显示一个特定的问题及其答案.通常我需要2个查询来做到这一点:
Question.objects.get(id=1)
Answer.objects.get(question_id=1)[:10]
Run Code Online (Sandbox Code Playgroud)
我希望使用一个查询检索所有内容.在MySQL中,它将是:
SELECT *
FROM Question JOIN Answer ON Question.id=Answer.question_id
WHERE Question.id=1
LIMIT 10
Run Code Online (Sandbox Code Playgroud)
无论如何我可以通过Django的ORM来做到这一点吗?请问extra()在这种情况下帮助吗?
我有这样的书模型:
class Book(models.Model):
authors = models.ManyToManyField(Author, ...)
...
Run Code Online (Sandbox Code Playgroud)
简而言之:
我想检索作者严格等于给定作者集的书籍.我不确定是否有单个查询可以执行此操作,但任何建议都会有所帮助.
长期:
这是我尝试过的(无法运行获取AttributeError)
# A sample set of authors
target_authors = set((author_1, author_2))
# To reduce the search space,
# first retrieve those books with just 2 authors.
candidate_books = Book.objects.annotate(c=Count('authors')).filter(c=len(target_authors))
final_books = QuerySet()
for author in target_authors:
temp_books = candidate_books.filter(authors__in=[author])
final_books = final_books and temp_books
Run Code Online (Sandbox Code Playgroud)
......这就是我得到的:
AttributeError: 'NoneType' object has no attribute '_meta'
Run Code Online (Sandbox Code Playgroud)
一般来说,我应该如何查询模型,其约束条件是其ManyToMany字段包含一组给定的对象,就像我的情况一样?
ps:我发现了一些相关的SO问题,但无法得到明确的答案.任何好的指针也会有所帮助.谢谢.
我有一个Django应用程序,用户发布照片,其他人在照片下留下评论.
留下评论时,我需要通知:
对于(1),我这样做:
#I slice by 25 because I arbitrarily deem anyone beyond that irrelevant.
all_commenter_ids = PhotoComment.objects.filter(which_photo=which_photo).order_by('-id').values_list('submitted_by', flat=True)[:25]
Run Code Online (Sandbox Code Playgroud)
接下来,对于(2),我尝试:
all_relevant_ids = all_commenter_ids.append(which_photo.owner_id)
all_relevant_ids = list(set(all_relevant_ids))
Run Code Online (Sandbox Code Playgroud)
我最终得到一个错误:
'ValuesListQuerySet'对象没有属性'append'
我觉得这很奇怪,因为我正在提取一个values_list.
这不是一个列表对象,在这种情况下,该属性不应该append工作吗?请解释什么是错的,并提出替代方案.
比方说,我有一个标签模型的pk列表
pk_list = [10, 6, 3]
Run Code Online (Sandbox Code Playgroud)
我有另一个模型,m2m字段的标签和一个实例,其中包含3个标签(上面的pks).
class Node(models.Model):
...
tags = models.ManyToManyField(Tag, related_name='nodes')
Run Code Online (Sandbox Code Playgroud)
我想检索一个包含我的pk_list中指定的精确标记集的节点.当我做
Node.objects.filter(tags__in=pk_list)
Run Code Online (Sandbox Code Playgroud)
它返回三个相同实例的列表
[<Node: My node title>, <Node: My node title>, <Node: My node title>]
Run Code Online (Sandbox Code Playgroud)
调用.get()不起作用,因为它显然必须返回单个实例.
那么,我该如何检索单个实例?我必须注意,如果我的pk_list不同,例如.[10,6]或[10,6,3,7]然后我必须得到任何东西.我需要一个完全匹配.
谢谢
上下文
我在Django Cache Machine中找到了一个相当关键的错误,它导致它的失效逻辑在从Django 1.4升级到1.7后失去了理智.
该错误本地化为only()扩展缓存机器的模型的调用CachingMixin.它导致深度递归,偶尔会破坏堆栈,但否则会产生巨大的flush_lists缓存机器用于模型的双向失效ForeignKey关系中.
class MyModel(CachingMixin):
id = models.CharField(max_length=50, blank=True)
nickname = models.CharField(max_length=50, blank=True)
favorite_color = models.CharField(max_length=50, blank=True)
content_owner = models.ForeignKey(OtherModel)
Run Code Online (Sandbox Code Playgroud)
m = MyModel.objects.only('id').all()
Run Code Online (Sandbox Code Playgroud)
错误
该错误发生在以下行中(https://github.com/jbalogh/django-cache-machine/blob/f827f05b195ad3fc1b0111131669471d843d631f/caching/base.py#L253-L254).在这种情况下,self是一个MyModel混合了延迟和未延迟属性的实例:
fks = dict((f, getattr(self, f.attname)) for f in self._meta.fields
if isinstance(f, models.ForeignKey))
Run Code Online (Sandbox Code Playgroud)
Cache Machine跨ForeignKey关系执行双向失效.它通过循环遍历a中的所有字段来实现Model并在缓存中存储一系列指针来指针指向当有问题的对象无效时需要无效的对象.
only()在Django ORM中的使用做了一些元编程魔术,它通过Django的DeferredAttribute实现覆盖了无法获取的属性.在正常情况下,访问favorite_color将调用DeferredAttribute.__get__(https://github.com/django/django/blob/18f3e79b13947de0bda7c985916d5a04e28936dc/django/db/models/query_utils.py#L121-L146)并从结果缓存中获取属性或数据源.它通过获取有问题的未延迟表示Model并only()在其上调用另一个查询来完成此操作.
这是循环遍历外键Model并访问其值时的问题,Cachine Machine引入了无意的递归.getattr(self, …
是否可以将Django模型设为只读?没有创建,更新等
注意这个问题不同于:
将Django模型设为只读?(这个问题允许创建新记录)
整个模型为只读(仅涉及Django管理界面 - 我希望模型只能在整个应用程序中读取)