标签: django-orm

Django:ORM是否支持SQL"IN"运算符?

Django ORM是否支持SQL IN运算符?就像是:

SELECT *
FROM user
WHERE id IN (1, 5, 34, 567, 229)
Run Code Online (Sandbox Code Playgroud)

如何使用Django ORM进行类似的查询?

谢谢.

django django-orm django-queryset

19
推荐指数
2
解决办法
1万
查看次数

LEFT JOIN 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?

python sql django django-models django-orm

19
推荐指数
3
解决办法
4万
查看次数

在Django REST框架中优化数据库查询

我有以下型号:

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

19
推荐指数
2
解决办法
1万
查看次数

禁止直接分配到多对多集合的前端.请改用emails_for_help.set()

我是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)

python django django-orm m2m

19
推荐指数
2
解决办法
2万
查看次数

Django:使用Django ORM实现JOIN?

我有一个用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()在这种情况下帮助吗?

django join django-models django-orm django-queryset

18
推荐指数
3
解决办法
4万
查看次数

Django:ManyToMany过滤器匹配列表中的所有项目

我有这样的书模型:

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 django-orm manytomanyfield django-queryset

18
推荐指数
2
解决办法
7594
查看次数

Django queryset values_list是否返回一个列表对象?

我有一个Django应用程序,用户发布照片,其他人在照片下留下评论.

留下评论时,我需要通知:

  1. 在这个帖子中写道的其他人
  2. 照片的所有者,如果他们不包括在(1)

对于(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工作吗?请解释什么是错的,并提出替代方案.

django django-models django-orm

18
推荐指数
1
解决办法
2万
查看次数

Django查询集可以获得精确的多任务查找

比方说,我有一个标签模型的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 django-orm django-queryset

17
推荐指数
1
解决办法
4267
查看次数

确定django中的属性是否为"DeferredAttribute"

上下文


我在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)并从结果缓存中获取属性或数据源.它通过获取有问题的未延迟表示Modelonly()在其上调用另一个查询来完成此操作.

这是循环遍历外键Model并访问其值时的问题,Cachine Machine引入了无意的递归.getattr(self, …

python django django-models django-orm django-cache-machine

17
推荐指数
2
解决办法
7542
查看次数

如何将模型设为只读?

是否可以将Django模型设为只读?没有创建,更新等

注意这个问题不同于:

将Django模型设为只读?(这个问题允许创建新记录)

整个模型为只读(仅涉及Django管理界面 - 我希望模型只能在整个应用程序中读取)

django readonly django-models django-orm

16
推荐指数
2
解决办法
1万
查看次数