标签: django-managers

从django.db.models.fields.related导入RelatedManager

我正在尝试这样做:

from django.db.models.fields.related import RelatedManager
Run Code Online (Sandbox Code Playgroud)

因为我希望能够测试一个对象是否是一个相关的经理,即:

isinstance(obj, RelatedManager)
Run Code Online (Sandbox Code Playgroud)

但是我一直收到这个错误:错误:无法导入名称RelatedManager

django django-managers

8
推荐指数
1
解决办法
1489
查看次数

Django模型与经理

不确定区别是什么.似乎所有管理器都有一堆与模型相关的功能.但是这些功能也可以放在模型中......

Django文档描述了Manager如下,

Manager是为Django模型提供数据库查询操作的接口.

那么管理器还有什么根本不同于这个简单的抽象?

或者更好的问题:在模型与经理中应该定义哪些方法?是否存在实际差异或只是文体差异?

django django-models django-managers

7
推荐指数
1
解决办法
1811
查看次数

始终推迟 Django 中的字段

如何使 Django 模型上的字段延迟该模型的所有查询,而不需要对每个查询进行延迟?

研究

功能于 2014 年被请求作为一项功能,但在 2022 年被拒绝

除了 Django 原生的功能之外,显而易见的想法是创建一个如下所示的自定义管理器:

class DeferedFieldManager(models.Manager):

    def __init__(self, defered_fields=[]):
        super().__init__()
        self.defered_fields = defered_fields

    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs
            ).defer(*self.defered_fields)

class B(models.Model):
    pass

class A(models.Model):
    big_field = models.TextField(null=True)
    b = models.ForeignKey(B, related_name="a_s")

    objects = DeferedFieldManager(["big_field"])

class C(models.Model):
    a = models.ForeignKey(A)

class D(models.Model):
    a = models.OneToOneField(A)

class E(models.Model):
    a_s = models.ManyToManyField(A)

Run Code Online (Sandbox Code Playgroud)

但是,虽然这适用于A.objects.first()(直接查找),但不适用于B.objects.first().a_s.all()(一对多)、C.objects.first().a(多对一)、D.objects.first().a(一对一)或E.objects.first().a_s.all()(多对多)。

我在这里发现特别令人困惑的是,这是我的对象的默认管理器,这意味着它也应该是反向查找(一对多和多对多)的默认管理器,但这不是在职的。根据Django 文档

默认情况下,用于反向关系的RelatedManager 是该模型的默认管理器的子类。

测试这一点的一个简单方法是删除应该从数据库延迟的字段,并且OperationalError: …

python django django-models django-managers

7
推荐指数
1
解决办法
1852
查看次数

覆盖Django get_or_create

我有一个模型,我覆盖了save方法,以便该save方法可以传递到一些数据并自动填写一个字段保存之前.这是我的模型:

class AccountModel(models.Model):

    account = models.ForeignKey(Account)

    def save(self, request=None, *args, **kwargs):
        if request:
            self.account = request.session['account']
        super(AccountModel, self).save(*args, **kwargs)

    class Meta:
        abstract = True
Run Code Online (Sandbox Code Playgroud)

我的想法是为需要与帐户关联的对象设置基本模型,然后我不必在每次出现时处理帐户连接(这很多).

但是:我也想使用get_or_create,它保存新对象而不传递请求.我知道不可以使用get_or_create和做一个try/ except而不是,但我想知道是否有一种方法可以覆盖,get_or_create以及正确的方法是什么.

我查看了代码Manager(我正在考虑重写),该get_or_create函数只调用一个QuerySet.get_or_create函数.也许我可以写它来使用其他管理器功能而不是QuerySet版本的get_or_create?你们都在想什么?

python django subclass django-models django-managers

6
推荐指数
1
解决办法
3682
查看次数

Django:在添加整数字段后在应用程序上运行makemigrations时出现"未知列"

首先,我最近从Django 1.6升级到1.8,从未使用过South,因此我不熟悉迁移.

我跑了:

> python manage.py makemigrations myapp
> python manage.py migrate --fake initial
Run Code Online (Sandbox Code Playgroud)

使用现有MySQL表为我的模型创建初始迁移.到目前为止一切似乎都很好

然后我在我的模型中添加了一个IntegerField:

new_integer_field = models.IntegerField(default = 50) #can include blank=True, null=True; seems to make no difference
Run Code Online (Sandbox Code Playgroud)

现在我跑的时候:

>python manage.py makemigrations myapp
Run Code Online (Sandbox Code Playgroud)

我明白了

django.db.utils.OperationalError: (1054, "Unknown column 'myapp_mymodel.new_integer_field' in 'field list'")
Run Code Online (Sandbox Code Playgroud)

追溯(从问题发生的地方开始)是:

Traceback (most recent call last):
    File "./manage.py", line 10, in <module>
        execute_from_command_line(sys.argv)
    File ".../django/core/management/__init__.py", line 338, in execute_from_command_line
        utility.execute()
    File ".../django/core/management/__init__.py", line 312, in execute
        django.setup()
    File ".../django/__init__.py", line 18, in setup
        apps.populate(settings.INSTALLED_APPS)
    File ".../django/apps/registry.py", …
Run Code Online (Sandbox Code Playgroud)

mysql django django-managers python-2.7 django-migrations

6
推荐指数
1
解决办法
7020
查看次数

如何从我带注释的Django查询中过滤/排除非活动注释?

我正在使用object_list通用视图来快速列出一组文章.每篇文章都附有评论.该查询使用注释Count()数量的注释,然后order_by()使用注释的数字.

'queryset': Article.objects.annotate(comment_count=Count('comments')).order_by('-comment_count'),
Run Code Online (Sandbox Code Playgroud)

注释是django.contrib.comments框架的一部分,并通过通用关系附加到模型.我在我的文章模型中添加了显式反向查找:

class Article(models.Models):
   ...
   comments = generic.GenericRelation(Comment, content_type_field='content_type', object_id_field='object_pk')
Run Code Online (Sandbox Code Playgroud)

问题是,这会计入"不活跃"的评论; 那些有is_public=Falseis_removed=True.如何排除任何不活动的评论?

django django-models django-queryset django-managers generic-relationship

5
推荐指数
1
解决办法
531
查看次数

django 软删除不会级联删除

我在我的 django 管理员中使用了软删除,就像这样。问题是,当我删除一个外键项目时,它似乎没有触发对其链接到的所有项目的删除。或者可能确实如此,但它没有运行我的模型上的自定义def delete

- 如果我删除了一个人,那么他们会被软删除,但相关的帐户不会受到影响。

- 如果我删除软删除,那么当我删除一个人时,帐户也会被删除,这是正确的。

所以理想情况下,当我删除一个人时,我希望它软删除这个人,并且引用这个人的帐户也被软删除(将它们标记为非活动状态)。

class Person(models.Model):
    description = models.CharField(max_length=100)

    def delete(self, *args, **kwargs):
        self.active = False
        self.deleted_date = datetime.now()
        self.save()

class Account(models.Model):
    name = models.CharField(max_length=50)
    person = models.ForeignKey(Person, null=True, blank=True)
    active = models.BooleanField(default=True, editable=False)

    objects = SoftDeleteManager()

    def delete(self, *args, **kwargs):
        self.active = False
        self.deleted_date = datetime.now()
        self.save()

    def __unicode__(self):
        return "%s: %s" % (self.type,self.name)
Run Code Online (Sandbox Code Playgroud)

更新:我已经更新了问题。我没有说我正在对 Person 模型运行软删除。还补充说,当 def 删除没有被覆盖时,级联删除工作,但是当我覆盖删除时,级联不会触发。

django django-admin django-managers

5
推荐指数
1
解决办法
6274
查看次数

使用参数创建 django 管理器

我有以下情况
我有一个管理器类,它根据字段过滤查询集。问题是字段名称因类而异,但它过滤的值来自同一个地方(所以我认为我不需要几个管理器)。这是我到目前为止所做的。

class MyManager(models.Manager):
    def __init__(self, field_name):
        super(MyManager, self).__init__()
        self.field_name = field_name

    def get_queryset(self):
        # getting some value
        kwargs = { self.field_name: some_value }
        return super(MyManager, self).get_queryset().filter(**kwargs)

class A:
    # some datamembers

    @property
    def children(self):
        return MyUtils.prepare(self.b_set.all())

class B:
    objects = MyManager(field_name='my_field_name')
    a = models.ForeignKey(A, null=False, blank=False)
Run Code Online (Sandbox Code Playgroud)

当我运行测试时,我从数据库中检索了一个 B 对象,并尝试读取该children属性时出现以下错误:

self = <django.db.models.fields.related_descriptors.RelatedManager object at 0x7f384d199290>, instance = <A: A object>

    def __init__(self, instance):
>       super(RelatedManager, self).__init__()
E       TypeError: __init__() takes exactly 2 arguments (1 given)
Run Code Online (Sandbox Code Playgroud)

我知道它是因为构造函数参数,因为当我删除它(或给它一个默认值)所有的测试工作。
我怎样才能克服这个问题?这是实现这一目标的正确方法吗? …

django django-managers

5
推荐指数
1
解决办法
2360
查看次数

使用 select_related 时,如何使用相关模型的自定义管理器?

例如,我有模型,

class ModelBManager(models.Manager):
    def get_queryset(self):
        return self.super().get_queryset().select_related('y')

class ModelA(models.Model):
    x = models.TextField()

class ModelB(models.Model):
    y = models.ForeignKey(ModelA)
    objects = ModelBManager()

class ModelC(models.Model):
    z = models.ForeignKey(ModelB)
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样做,ModelC.objects.get(id=1).z我将获得ModelB带有预取ModelA实例(ModelBManager工作)的实例。

但是,如果我这样做ModelC.objects.select_related('z')[0].z,则不会有ModelA带有ModelB实例的预取实例。(基本上ModelBManager不起作用!)

任何人都知道我该如何实现这一目标?

谢谢

django django-models django-queryset django-managers django-rest-framework

5
推荐指数
1
解决办法
1042
查看次数

UniqueConstraint 与 unique_together 之间的区别 - Django 2.2?

我使用 version 在 Django 中启动了新项目2.2,它具有新的约束唯一约束,这与unique_together相同还是有任何其他差异?

django django-models django-queryset django-managers python-3.6

5
推荐指数
2
解决办法
1778
查看次数