标签: django-orm

如何删除 Django 中的所有多对多对象

我有一个模型 Foo。这与 Moo 有着多对多的关系。

现在 Foo 在其多对多字段中有许多对象,即它有 moo1、moo2、moo3 等,如何一起删除所有对象?我知道我们可以单独删除每个。

foo = FOO()
foo.save()
foo.moo.add(moo1)
foo.moo.remove(moo1)
Run Code Online (Sandbox Code Playgroud)

IE

foo = FOO()
foo.save()
foo.moo.add(moo1)
foo.moo.add(moo2)
foo.moo.reset() # This should remove all objects that have been added
                  # in this field. This does not work but I want
                  # something like this. 
Run Code Online (Sandbox Code Playgroud)

django django-orm

3
推荐指数
1
解决办法
2216
查看次数

使用多数据库的 Django 事务

我有三个数据库,我想根据一个请求在事务中向它们添加数据。

\n\n

例如我的代码。

\n\n
@transaction.commit_manually\ndef my_view(request):\n    try:\n        MyModel_one(...).save(using='default')\n        MyModel_two(...).save(using='db_one')\n        MyModel_three(...).save(using='db_two') # <-- for example we make exception here (duplicate data)\n    except IntegrityError:\n        transaction.rollback()\n        transaction.rollback(using='db_one')\n        transaction.rollback(using='db_two')\n        return ...\n    transaction.commit()\n    transaction.commit(using='db_one')\n    transaction.commit(using='db_two')\n    return ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果:

\n\n
    \n
  1. MyModel_one \xe2\x80\x94 数据未保存
  2. \n
  3. MyModel_two \xe2\x80\x94 数据已保存(我不明白为什么)
  4. \n
  5. MyModel_two \xe2\x80\x94 数据未保存,因为希望错误
  6. \n
\n\n

问题:为什么交易在这里不起作用?我该怎么做才能获得工作交易?

\n\n

(我尝试使用其他方法,但没有成功)\n(而且我知道这不是漂亮的代码,但对于理解问题来说非常简单)

\n\n

Django 1.7.7\nPython 2.7

\n\n

数据库:\n默认 \xe2\x80\x94 postgres\ndb_one \xe2\x80\x94 mysql\ndb_two \xe2\x80\x94 mysql

\n

python django django-models django-orm

3
推荐指数
1
解决办法
3804
查看次数

Django 独特的不能与 Postgres 一起使用

我正在配置一个 API 来提取结果列表。这些物品是服装“产品”,有多种“变体”。

我试图使用unique来确保查询集仅返回唯一产品的列表 - 而不是由于许多变化而重复多次的同一产品。

过去,我在产品的主键(id)上使用了distinct。但是,下面的代码不起作用。

当我尝试使用“distinct”时,出现 500 错误。没有它-我不会得到任何错误。我无法在本地测试,因为 SQLite 不喜欢不同的。我在用

class InternalListView(APIView):

    renderer_classes = (JSONRenderer, )

    def get(self, request, *args, **kwargs):

        filters = {}
        for key, value in request.GET.items():
            key = key.lower()
            if key in countmatch:
                lookup, val = internalmatch[key](value.lower())
                filters[lookup] = val

        qset = (
            Product.objects
            .filter(**filters)
            .distinct('id')
            .order_by('-rating')
            .values('name', 'brand', 'rating')
            .annotate(
                price=F('variation__price__price'),
                id=F('pk'),
                vari=F('variation'),
            )
        )

        for i in qset:
            i['likes'] = random.randint(500, 1000)

        print qset

        return Response(qset.all())
Run Code Online (Sandbox Code Playgroud)

python django postgresql django-orm django-rest-framework

3
推荐指数
1
解决办法
2229
查看次数

Django 内存模型,不用于测试

我有一个模型,其实例永远不需要写入数据库。它们是动态生成的,成本非常低,而且几乎永远不会改变。

我希望通过 ORM 查询这些实例,并在 django-admin 中浏览它们(只读+mass_actions,不需要 CRUD)。

据我所知,SQLite 在运行测试时使用内存数据库。我想我想使用这个功能,但不仅仅限于测试。

另一种选择可能是纯内存模型后端,但我没有找到。实际上我确实找到了这个项目: https: //github.com/felipecruz/dmqs但它看起来有点过时了。

或者也许有一个缓存后端可以做到这一点?

django django-models django-orm django-cache

3
推荐指数
1
解决办法
1334
查看次数

在Django中的save方法中动态添加多对多关系

我的内容模型与标签模型具有多对多关系。当我保存内容对象时,我想动态添加关系。我按照以下方式执行此操作。

# models.py   

def tag_content(content_id):
    obj = Content.objects.get(pk=content_id)
    print obj # Checking
    obj.tags = [1, 2, 3] # Adding the relationships using the Tag IDs

class Tag(models.Model):
    name = models.CharField(max_length=255)

class Content(models.Model):
    title = models.CharField(max_length=255)
    is_tagged = models.BooleanField(default=False)
    tags = models.ManyToManyField(Tag, blank=True)

    def save(self, *args, **kwargs):
        super(Content, self).save(*args, **kwargs)
        if not self.is_tagged:
            tag_content(self.pk) # calling the tagging method
Run Code Online (Sandbox Code Playgroud)

换句话说,当一个Content对象被保存时,它的tags字段与3个不同的Tag对象模型相关。只是为了让您知道,我的数据库中确实有 pks = 1、2 和 3 的标签。

然而,这根本行不通。save 方法调用 tag_content 方法,因为 print obj 语句有效。但是,多对多字段未设置并且仍为空。有趣的是,如果我在 shell 中运行以下命令,标签字段就会完美设置。

# python manage.py shell
from myapp.models …
Run Code Online (Sandbox Code Playgroud)

django many-to-many django-models django-orm

3
推荐指数
1
解决办法
3560
查看次数

Django 模型中的 lower()

这是我的查询

SELECT * FROM `music` where lower(music.name) = "hello"

我怎样才能用 django 发送这个查询

我尝试了这个,但它没有在查询中添加更低的值

>>> Music.objects.filter(name__iexact="hello")
(0.144) SELECT `music`.`id`, `music`.`name`, `music`.`artist`, `music`.`image`, `music`.`duration`, `music`.`release_date`, `music`.`is_persian` FROM `music` WHERE `music`.`name` LIKE 'hello' LIMIT 21; args=('hello',)
<QuerySet []>
Run Code Online (Sandbox Code Playgroud)

django django-models django-orm python-3.x

3
推荐指数
1
解决办法
4927
查看次数

Django 2.0 - iexact 翻译为 LIKE 而不是 ILIKE

我有一个这样的模型:

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()

    class Meta:
        db_table = 'article'
Run Code Online (Sandbox Code Playgroud)

我写了查询:

articles = Article.objects.filter(title__iexact='hello world')
print(articles.query)
Run Code Online (Sandbox Code Playgroud)

输出是:

SELECT ... FROM `article` WHERE `article`.`title` LIKE hello world
Run Code Online (Sandbox Code Playgroud)

可以看到iexact被翻译成了LIKE。但是 django 文档说它将转换为 ILIKE,谁错了?

顺便一提:

  1. 我的 mysql 排序规则是 utf8_bin。

  2. mysql 在 ubuntu 上提供服务。

  3. 代码在windows上运行。

mysql django django-models django-orm

3
推荐指数
1
解决办法
2104
查看次数

TimeField 不支持“之间”查找或不允许在该字段上进行连接

我有一个这样的模型:

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    create_time = models.DateTimeField(auto_now_add=True,null=True)
Run Code Online (Sandbox Code Playgroud)

我在视图函数中编写了一条查询语句,如下所示:

from datetime import time
start_time = time(hour=17)
end_time = time(hour=18)
articles = Article.objects.filter(create_time__time__between=(start_time,end_time))
Run Code Online (Sandbox Code Playgroud)

但是Django引发异常django.core.exceptions.FieldError: Unsupported lookup 'between' for TimeField or join on the field not permitted.django文档说这是正确的。如果我想要过滤时间在17到18之间,我该怎么办?

django django-models django-orm

3
推荐指数
1
解决办法
1777
查看次数

django prefetch_lated &amp; 预取嵌套

我正在尝试返回每个UserProfile,其中有一对多Subscription,有一个外键 和ArtistUserProfile每个艺术家有很多ReleaseGroup,每个人拥有的未来发行组的数量UserProfile

简而言之:我想返回每个用户拥有的所有订阅的即将发布版本的总数。

然而,在我数数之前我就被困住了......

    context['test_totals'] = UserProfile.objects.prefetch_related(
        Prefetch('subscription_set', queryset=Subscription.objects.
                 prefetch_related(Prefetch('artist', queryset=Artist.objects.
                                           prefetch_related(Prefetch('release_groups',
                                             queryset=ReleaseGroup.objects.filter(
                                        release_date__gte=startdate
        ), to_attr='rggg')), to_attr='arti')), to_attr='arts'))
Run Code Online (Sandbox Code Playgroud)

在模板中访问userprofile.arts|length会返回订阅总数,但rggg不会arti返回任何内容。如何才能做到这一点?

我尝试使用 )` 对自身进行过滤filter(profile='userprofile,但这会返回错误。如果我可以自我过滤,我可能可以让它发挥作用吗?

django django-orm

3
推荐指数
2
解决办法
6031
查看次数

Django ORM 在注释多个聚合列时删除不需要的组

我想在 django ORM 中创建一个类似这样的查询。

SELECT COUNT(CASE WHEN myCondition THEN 1 ELSE NULL end) as numyear
FROM myTable
Run Code Online (Sandbox Code Playgroud)

以下是我编写的 djang ORM 查询

year_case = Case(When(added_on__year = today.year, then=1), output_field=IntegerField())

qs = (ProfaneContent.objects
                    .annotate(numyear=Count(year_case))
                    .values('numyear'))
Run Code Online (Sandbox Code Playgroud)

这是由 django orm 生成的查询。

SELECT COUNT(CASE WHEN "analyzer_profanecontent"."added_on" BETWEEN 2020-01-01 00:00:00+00:00 AND 2020-12-31 23:59:59.999999+00:00 THEN 1 ELSE NULL END) AS "numyear" FROM "analyzer_profanecontent" GROUP BY "analyzer_profanecontent"."id"
Run Code Online (Sandbox Code Playgroud)

所有其他事情都很好,但是 django在最后放置了一个GROUP BY导致多行和错误答案。我根本不想那样。现在只有一列,但我会放置更多这样的列。

根据评论进行编辑 我将使用 qs 变量来获取我的分类在当前年、月、周的值。

更新 根据我来到这里的评论和答案,让我澄清一下。我只想在数据库端执行此操作(显然使用 Django ORM 而不是 RAW SQL)。它是一个简单的 sql 查询。由于数据可能太大,在 Python 端做任何事情都是低效的。这就是为什么我希望数据库根据 CASE …

sql django orm django-models django-orm

3
推荐指数
1
解决办法
690
查看次数