标签: django-orm

如何正确查询ManyToManyField列表中的所有对象(或另一个ManyToManyField)?

我对构建Django查询的最佳方法感到困惑,该查询检查字段(或列表)的所有元素ManyToMany是否存在于另一个ManyToMany字段中.

举个例子,我有几个Person,可以有多个专业.也有Jobs表示人们就可以开始,但他们需要一个或多个Specialtys到有资格被启动.

class Person(models.Model):
    name = models.CharField()
    specialties = models.ManyToManyField('Specialty')

class Specialty(models.Model):
    name = models.CharField()

class Job(models.Model):
    required_specialties = models.ManyToManyField('Specialty')
Run Code Online (Sandbox Code Playgroud)

一个人只有拥有工作所需的所有专业,才能开始工作.所以,再举一个例子,我们有三个专长:

  • 编码
  • 唱歌
  • 跳舞

我有一个Job需要唱歌和舞蹈的专业.有歌唱和舞蹈专业的人可以开始,但另一个有编码和歌唱专业的人不能 - 因为工作需要一个可以唱歌和跳舞的人.

所以,现在我需要一种方法来找到一个人可以承担的所有工作.这是我解决问题的方法,但我确信这是一种更优雅的方法:

def jobs_that_person_can_start(person):
    # we start with all jobs
    jobs = Job.objects.all()
    # find all specialties that this person does not have
    specialties_not_in_person = Specialty.objects.exclude(name__in=[s.name for s in person.specialties])
    # and exclude jobs that require …
Run Code Online (Sandbox Code Playgroud)

django django-orm django-queryset

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

Django按两个字段订购商品,但如果它们为零,则忽略它们

我有以下模型(为了这个问题的目的大大简化):

class Product(models.Model):
    price = models.DecimalField(max_digits=8, decimal_places=2)
    sale_price = models.DecimalField(max_digits=10, blank=True, null=True, decimal_places=2)
Run Code Online (Sandbox Code Playgroud)

对于大多数产品,价格将被填补,但sale_price将不会.所以,我可以按价格订购产品:

Product.objects.order_by('price')
Product.objects.order_by('-price')
Run Code Online (Sandbox Code Playgroud)

但是,有些产品会有sale_price,我找不到一种方法来整齐地订购这些产品,以便销售价格与正常价格交错.如果我尝试按两个字段排序:

Product.objects.order_by('sale_price','price')
Run Code Online (Sandbox Code Playgroud)

...然后,所有未售出的产品一起显示,然后是所有产品,而不是交叉价格.

这有意义吗?有没有人有办法解决这个问题?

谢谢!

django sql-order-by django-orm

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

如何将模型设为只读?

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

注意这个问题不同于:

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

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

django readonly django-models django-orm

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

Django ORM中的每事务隔离级别

是否可以为自定义事务设置隔离级别(但不能使用原始sql)?

例如,类似于:

with transaction.commit_on_success(isolation='SERIALIZABLE'):
    bla
Run Code Online (Sandbox Code Playgroud)

python django transactions django-orm

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

Django 1.8 ArrayField追加和扩展

Django 1.8 将带有新的高级字段类型,包括依赖于PostgreSQL的ArrayField,并在数据库级别实现.

PostgreSQL的数组字段实现了一个append方法.

但是,我找不到任何关于附加项目的文档ArrayField.这显然非常有用,因为它允许更新字段而不将其全部内容从数据库转移回数据库.

这可能吗?如果不是将来可能的话?任何指向我错过的文档的指针都将非常感激.

为了澄清我的要求,这将是伟大的:

注意:这是幻想代码,我认为不会工作(我没试过)

# on model:
class Post(models.Model):
    tags = ArrayField(models.CharField(max_length=200))

# somewhere else:
p = Post.objects.create(tags=[str(i) for i in range(10000)])
p.tags.append('hello')
Run Code Online (Sandbox Code Playgroud)

目前有没有办法做到这一点,而不诉诸原始的SQL?

python django postgresql django-orm django-1.8

16
推荐指数
4
解决办法
9950
查看次数

通过app_label在子目录中建模?

为了将我的模型子文件夹中我试图用app_label元字段描述这里.

我的目录结构如下所示:

  • 项目
    • 应用
      • FOO
        • 楷模
          • __init__.py
          • bar_model.py

在bar_model.py中,我将我的模型定义为:

from django.db import models

class SomeModel(models.Model):

    field = models.TextField()

    class Meta:
        app_label = "foo"
Run Code Online (Sandbox Code Playgroud)

我可以像这样成功导入模型:

from apps.foo.models.bar_model import SomeModel
Run Code Online (Sandbox Code Playgroud)

但是,运行:

./manage.py syncdb
Run Code Online (Sandbox Code Playgroud)

不会为模型创建表.在详细模式中,我确实看到应用程序"foo"被正确识别(它在settings.py中的INSTALLED_APPS中).将模型移动到foo下的models.py确实有效.

是否有一些特定的约定没有记录在app_label中,或者整个机制阻止了这个模型结构被syncdb识别?

django django-models django-orm

15
推荐指数
1
解决办法
8385
查看次数

如何在Django中实现关注者/关注者

我想在我的Django应用程序中实现关注者/关注功能.

我为每个用户(django.contrib.auth.User)提供了一个UserProfile类:

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique = True, related_name = 'user')
    follows = models.ManyToManyField("self", related_name = 'follows')
Run Code Online (Sandbox Code Playgroud)

所以我试着在python shell中这样做:

>>> user_1 = User.objects.get(pk = 1) # <-- mark
>>> user_2 = User.objects.get(pk = 2) # <-- john
>>> user_1.get_profile().follows.add(user_2.get_profile())
>>> user_1.get_profile().follows.all()
[<UserProfile: john>]
>>> user_2.get_profile().follows.all()
[<UserProfile: mark>]
Run Code Online (Sandbox Code Playgroud)

但正如您所看到的,当我向用户的follows字段添加新用户时,还会在另一侧添加对称关系.从字面上看:如果user1跟随user2,user2也跟随user1,这是错误的.

哪里是我的错?你有没有办法实施粉丝并正确遵循?

感谢你们.

python django django-orm

15
推荐指数
2
解决办法
6519
查看次数

Django ORM:Group by和Max

我有一个看起来像这样的模型:

Requests: user, req_time, req_text
Run Code Online (Sandbox Code Playgroud)

在数据库中,记录可能如下所示:

id, user_id, req_time, req_text
1     1      TIMESTAMP  YES
2     1      TIMESTAMP  NO
3     2      TIMESTAMP  YES
Run Code Online (Sandbox Code Playgroud)

等等

如何编写Django ORM查询:按用户对请求进行分组,根据req_text过滤请求,还可以选择结果结果集的最大ID.因此,对于每个用户,我将返回一行符合过滤条件并且具有最大id.

django django-orm

15
推荐指数
1
解决办法
9264
查看次数

Django order_by特定订单

是否有可能在django ORM中复制这种特定的sql顺序:

order by

(case

    when id = 5 then 1

    when id = 2 then 2

    when id = 3 then 3

    when id = 1 then 4

    when id = 4 then 5

end) asc
Run Code Online (Sandbox Code Playgroud)

django django-orm

15
推荐指数
3
解决办法
4821
查看次数

我可以从Django ORM查询中删除ORDER BY吗?

看起来Django默认会添加ORDER BY到查询中.我可以清除它吗?

from slowstagram.models import InstagramMedia
print InstagramMedia.objects.filter().query
Run Code Online (Sandbox Code Playgroud)
SELECT
  `slowstagram_instagrammedia`.`id`,
  `slowstagram_instagrammedia`.`user_id`, 
  `slowstagram_instagrammedia`.`image_url`,
  `slowstagram_instagrammedia`.`video_url`,  
  `slowstagram_instagrammedia`.`created_time`,  
  `slowstagram_instagrammedia`.`caption`, 
  `slowstagram_instagrammedia`.`filter`, 
  `slowstagram_instagrammedia`.`link`, 
  `slowstagram_instagrammedia`.`attribution_id`, 
  `slowstagram_instagrammedia`.`likes_count`, 
  `slowstagram_instagrammedia`.`type`
FROM
  `slowstagram_instagrammedia`
ORDER BY
  `slowstagram_instagrammedia`.`id`
ASC
Run Code Online (Sandbox Code Playgroud)

```

django-orm

15
推荐指数
2
解决办法
4835
查看次数