标签: django-orm

django - 通过过滤对象列表来获取对象列表

我正在创建用户活动流。

活动模型:

class Activity(models.Model):
    actor = models.ForeignKey(User)
    action = models.CharField(max_length=100)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    pub_date = models.DateTimeField(auto_now_add=True, auto_now=False)
Run Code Online (Sandbox Code Playgroud)

关系模型:

class Person(models.Model):
    user = models.OneToOneField(User)
    relationships = models.ManyToManyField('self', through='Relationship', 
                                           symmetrical=False, 
                                           related_name='related_to')
RELATIONSHIP_FOLLOWING = 1
RELATIONSHIP_BLOCKED = 2
RELATIONSHIP_STATUSES = (
    (RELATIONSHIP_FOLLOWING, 'Following'),
    (RELATIONSHIP_BLOCKED, 'Blocked'),
)

class Relationship(models.Model):
    from_person = models.ForeignKey(Person, related_name='from_people')
    to_person = models.ForeignKey(Person, related_name='to_people')
    status = models.IntegerField(choices=RELATIONSHIP_STATUSES)  

def get_relationships(self, status):
    return self.relationships.filter(
        to_people__status=status, 
        to_people__from_person=self)

def get_following(self):
    return self.get_relationships(RELATIONSHIP_FOLLOWING)
Run Code Online (Sandbox Code Playgroud)

在意见中:

def home(request):
    if request.user.is_authenticated():
        user …
Run Code Online (Sandbox Code Playgroud)

django django-models django-orm django-views

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

在 Django 过滤器中使用 dateadd

我有一个按开始日期和持续时间(以天为单位)定义订阅期的模型:

class SubscriptionProduct(models.Model):    
    start_date = models.DateField()
    duration = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)

我需要能够过滤当前处于活动状态的订阅,例如start_date < now < start_date+duration

我找不到 django 的方式来做到这一点。我可以使用使用 postgres 的 DATEADD 等效的 INTERVAL 的原始 SQL 语句,但我更喜欢使用内置的和非数据库特定的东西。

我假设理想情况下我正在寻找 dateadd 注释方法。就像是:

SubscriptionProduct.objects.annotate(end_date=DateAdd('start_date','duration').filter(start_date__lt=datetime.now, end_date__gte=datetime.now)
Run Code Online (Sandbox Code Playgroud)

python django postgresql django-orm

4
推荐指数
1
解决办法
1198
查看次数

如何在 Django 模型字段中强制执行 char(N) 数据类型而不是 varchar(N)

根据 django 文档https://docs.djangoproject.com/en/1.9/topics/db/models/

它是 ORM 创建varchar字段而不是char.

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
Run Code Online (Sandbox Code Playgroud)

和等效的 sql 语句

CREATE TABLE myapp_person (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
); 
Run Code Online (Sandbox Code Playgroud)

所以在这里我们可以看到它正在使用 varchar,但我可以使用它char。我找不到办法。除了手动更改列

mysql django postgresql django-models django-orm

4
推荐指数
2
解决办法
3566
查看次数

在新版本的Django中,DateModifierNode的替代品是什么

我想基于模型的两个字段进行查询,日期,偏移量为int,用作timedelta

model.objects.filter(last_date__gte=datetime.now()-timedelta(days=F('interval')))
Run Code Online (Sandbox Code Playgroud)

是一个禁忌,因为F()表达式不能传递给timedelta

一点点挖掘,我发现DateModifierNode- 尽管它似乎在这个提交中删除了:https://github.com/django/django/commit/cbb5cdd155668ba771cad6b975676d3b20fed37b(来自这个现在过时的SO问题Django:在datetime.timedelta中使用F参数在查询中)

提交提到:

.dates()查询是使用自定义Query,QuerySet和Compiler类实现的.而是使用表达式和数据库转换器API实现它们.

这听起来很明智,就像应该有一个快速简单的方法 - 但我已经无果而终地寻找如何做太久的事情 - 任何人都知道答案?

python django orm django-models django-orm

4
推荐指数
2
解决办法
1078
查看次数

django:在 transaction.atomic() 内提交和提升

我们正在尝试从 to 迁移commit_manuallyatomic以便我们可以在遗留项目中将 Django 升级到至少 1.8。在大多数情况下,我们需要做这样的事情:

with transaction.atomic():
    obj = Entity.objects.select_for_update().get(pk=pk)
    try:
        obj.do_something()
        obj.set_some_status()
        obj.save()
    except SomeException:
        obj.set_failed_flag()
        obj.save()
        raise
Run Code Online (Sandbox Code Playgroud)

因为被调用者需要这个异常信息才能继续特定的流程。但在这种情况下,事务/保存点将被回滚,这不是我们想要的,因为我们想要obj.set_failed_flag()提交。此外,将它设置在同一个原子块中似乎是合乎逻辑的,因为我们已经为这个对象锁定了一个行。

任何想法/模式?提前致谢!

PS 使用旧的手动事务管理非常简单!

PPS 我们也将例外用于“提前退出”,并且移动到某些标志等会带来混乱的日志,我个人很想避免它。

python django transactions django-orm

4
推荐指数
1
解决办法
3724
查看次数

如何为已获取的列表预获取相关对象?

我在主页上显示 7 个随机对象。为此,我使用基于此答案的解决方案:

class ProductManager(models.Manager):
    def random(self, n_products, filter={}, select_related=None):
        n_products_total = self.filter(**filter).count()
        if n_products_total == 0:
            return []
        r = [self.random_impl(n_products_total, filter, select_related) for i in range(n_products)]
        return [p for p in r if p is not None]

    def random_impl(self, n_products, filter, select_related=None):
        random_index = randint(0, n_products - 1)
        try:
            return self.filter(**filter) \
                .select_related(select_related)[random_index]
        except IndexError:
            return None

random_products = Product.objects.random(7, filter={'enabled': True}, select_related='category')
Run Code Online (Sandbox Code Playgroud)

如果我传递prefetch_related=Prefetch('productphoto_set', queryset=ProductPhoto.objects.order_by('pk'))random_impl方法,它会为每个产品一次预取 1 张照片。这并不奇怪。产品已经被提取后,我可以手动预提取相关对象吗?

django django-models django-orm

4
推荐指数
1
解决办法
2276
查看次数

Django/Postgres:在 RangeField 上聚合

是否可以对Django's执行聚合函数RangeField

假设我们有 3 个带有BigIntegerField price_range.

第一个对象: price_range = [10,5000]

第二个对象: price_range = [1,5000]

第三个对象: price_range = [100,9000]

这三个对象的结果MaxMin聚合将是:

min = 1max = 9000

我试图聚集MaxMin这种方式:

MyModel.objects.aggregate(Min('price_range'),Max('price_range'),)
Run Code Online (Sandbox Code Playgroud)

这引发了错误:

ProgrammingError: function min(int8range) 不存在 LINE 1: SELECT MIN("app_mymodel"."price_range") AS "price_range__min" FROM "app...

sql django postgresql aggregate-functions django-orm

4
推荐指数
1
解决办法
276
查看次数

如何将多个模型绑定到一个 ManyToManyField?

例如,有这样的类:

class A(models.Model):
 id = models.CharField(max_length=256, primary_key=True)
 mtm = models.ManyToManyField(B, C, D)

class B(models.Model):
 id = models.CharField(max_length=256, primary_key=True)
class C(models.Model):
 id = models.CharField(max_length=256, primary_key=True)
class D(models.Model):
 id = models.CharField(max_length=256, primary_key=True)
Run Code Online (Sandbox Code Playgroud)

我知道字段的实现类是错误的,这样做是为了更清楚。您需要拥有该模型并且与模型 b、C、D 建立了 ManyToMany 关系。如何才能做到这一点?有专门的领域吗?

django orm django-models django-orm

4
推荐指数
1
解决办法
1943
查看次数

无法从字段名称有双下划线的 django 查询

无法从 django 查询字段名称有双下划线的地方。这是因为在 django 中查询语言__有其自身的含义

那么如何查询实际名称为 的字段"my__fyeild__name"呢?

template.fields.filter(my__fyeild__name="aaa")
Run Code Online (Sandbox Code Playgroud)

在数据库中,该列的名称带有两个下划线__,我不允许重命名该列。

django django-models django-orm

4
推荐指数
1
解决办法
1032
查看次数

Django达到了序列的最大值

我正在运行一个每天创建数百万条记录的程序,运行该程序一年多后,似乎我已经达到了 postgres 数据库的 id 限制。

我收到的错误是

django.db.utils.DataError:nextval:达到序列“main_records_id_seq”的最大值(2147483647)

有没有办法使用 SQL 或 django ORM 来扩展最大 id?或者有更好的解决方案吗?

django postgresql django-orm

4
推荐指数
2
解决办法
516
查看次数