标签: django-orm

Django - 具有伴随存储字段的自定义虚拟模型字段

我想要一个ConfirmationField字段类型.我希望这个字段像布尔字段一样工作.我不需要将此信息存储在数据库中,而是希望将确认日期存储在单独的字段中.

class MyModel(models.Model):
    confirmation = ConfirmationField()


m = MyModel()
m.confirmation # False
m.confirmation_timestamp # None

m.confirmation = True
m.save()

m.confirmation_timestamp # datetime object


m.confirmation = False
m.save()

m.confirmation_timestamp # None again
Run Code Online (Sandbox Code Playgroud)

我需要将两个字段都作为Field实例,我需要能够在Admin中使用它们.

我已阅读文档并检查代码,ForeignKey使用以下代码更改其数据库列名称:

def get_attname(self):
    return '%s_id' % self.name
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何使用其余代码作为示例.看来我的目标并不需要太多的复杂性.

ImageField保存模型时,我还发现了保存的额外信息:

    if self.field.width_field:
        setattr(self.instance, self.field.width_field, self.width)
    if self.field.height_field:
        setattr(self.instance, self.field.height_field, self.height)
Run Code Online (Sandbox Code Playgroud)

但是我当然不希望confirmation自己存储在数据库中.因为(confirmation_timestamp- > confirmation)None== False<datetime instance>==,我会造成冗余True.

任何指针/想法都表示赞赏.

谢谢.

编辑:目前看来这是不可能的.我最终改变了我的API.这是一个snipplet,让我知道我是如何做到的:

    value …
Run Code Online (Sandbox Code Playgroud)

django django-models django-orm django-admin

0
推荐指数
1
解决办法
4014
查看次数

创建一个表示查询集联合的查询集

假设我有以下模型:

class House(models.Model):
    address = models.CharField(max_length=255)

class Person(models.Model):
    name = models.CharField(max_length=50)
    home = models.ForeignKey(House, null=True, related_name='tenants')

class Car(models.Model):
    make = models.CharField(max_length=50)
    owner = models.ForeignKey(Person)
Run Code Online (Sandbox Code Playgroud)

假设我需要(尽管很奇怪)获得:

  • 住在房子里或名为“约翰”的人的名单
  • 以上人士的汽车清单

我想要两个功能:

  • get_tenants_or_johns(house)
  • get_cars_of_tenants_or_johns(house)

我可以将它们定义为:

from django.db.models.query_utils import Q

def get_cars_of_tenants_or_johns(house):
    is_john = Q(owner__in=Person.objects.filter(name='John'))
    is_tenant = Q(owner__in=house.tenants.all())
    return Car.filter(is_john | is_tenant)

def get_tenants_or_johns(house):
    johns = Person.objects.filter(name='John')
    tenants = house.tenants.all()
    return set(johns) | set(tenants)
Run Code Online (Sandbox Code Playgroud)

问题是在上面的例子中重复了逻辑。如果我可以get_tenants_or_johns(house)返回一个queryset我可以定义get_cars_of_tenants_or_johns(house)为:

def get_cars_of_tenants_or_johns(house):
    return Car.objects.filter(owner__in=get_tenants_or_johns(house))
Run Code Online (Sandbox Code Playgroud)

为此,get_tenants_or_johns(house)需要返回查询集的联合,而不将它们转换为其他集合。

我无法弄清楚如何实现,get_tenants_or_johns(house)以便它返回一个包含 SQL 的查询集UNION。有没有办法做到这一点?如果没有,是否有另一种方法来实现我想要做的事情?

python django django-orm

0
推荐指数
1
解决办法
3655
查看次数

如何计算有多少是不喜欢的,有多少是喜欢的?

class ObjectRate(models.Model):
    user = models.ForeignKey(User)
    my_object = models.ForeignKey(Design)
    rate = models.DecimalField(max_digits=2,decimal_places=1)
Run Code Online (Sandbox Code Playgroud)

rate可以设置为-1(不喜欢)或1(喜欢).如何计算有多少是不喜欢的,有多少是喜欢的?(对于单个对象)

views.py:

def my_views(request,id):
    my_object = Object.objects.get(id=id)
    votes = ObjectRate.objects.filter(..)
Run Code Online (Sandbox Code Playgroud)

使用什么"算法"?

django django-orm

0
推荐指数
1
解决办法
579
查看次数

如何输出Django Admin生成的SQL

如何输出Django管理员正在生成的SQL来查询dhangelist页面的结果?我尝试queryset()通过以下方法覆盖:

def queryset(self, *args, **kwargs):
    qs = super(MyAdmin, self).queryset(*args, **kwargs)
    print 'sql:',qs.query
    return qs
Run Code Online (Sandbox Code Playgroud)

但是即使我正在浏览/admin/myapp/mymodel/?segment=123&date=2012-1-1,这也会显示查询:

sql: SELECT myapp_mymodel.id, myapp_mymodel.segment, myapp_mymodel.start_date
FROM myapp_mymodel ORDER BY myapp_mymodel.start_date ASC
Run Code Online (Sandbox Code Playgroud)

请注意,完全没有我在URL中指定的任何过滤器。

我正在尝试调试一个奇怪的问题,即如果我手动查询SQL中的表,会看到一个结果,但是Django的管理员显示的是完全不同的东西。我怀疑Django中有一个错误会导致生成错误的SQL,但是我需要查看SQL来确认这是问题所在。

我正在使用Django 1.5。

python django django-orm

0
推荐指数
1
解决办法
938
查看次数

在Django ORM中执行反连接

我有两个模型:

class Note(model):
    <attribs>

class Permalink(model):
    note = foreign key to Note
Run Code Online (Sandbox Code Playgroud)

我想执行一个查询:获取没有固定链接的所有笔记。在SQL中,我会像这样:

SELECT * FROM Note WHERE id NOT IN (SELECT note FROM Permalink); 
Run Code Online (Sandbox Code Playgroud)

想知道如何在ORM中执行此操作。

编辑:我不想让所有的永久链接进入我的应用程序。而是希望它作为查询在数据库内运行。

django django-models django-orm

0
推荐指数
1
解决办法
173
查看次数

Model在Manager中没有属性"DoesNotExists"

Django 1.7 Exceptions文档例外.DoesNotExist:

当找不到查询的给定参数的对象时,会引发DoesNotExist异常.Django提供了一个DoesNotExist异常作为每个模型类的属性,以识别无法找到的对象类,并允许您使用try/except捕获特定的模型类.

根据以上文档,我编写了自定义模型管理器:

class CountryManager(models.Manager):
    def get_special(self, *args, **kwargs):
        kwargs.update({'country': settings.ACTIVE_COUNTRY})
        try:
            return self.get(*args, **kwargs)
        except self.model.DoesNotExists:
            self.logger.warning('Unable to find specific object using filter {}'.format(kwargs))
            kwargs.update({'country': settings.DEFAULT_COUNTRY})
            return self.get(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

请注意: 此示例简化了{'country': settings.ACTIVE_COUNTRY}和带的行{'country': settings.DEFAULT_COUNTRY}

class CountryModelMixing(models.Model):
    country = models.CharField(
        max_length=2,
        default=settings.DEFAULT_COUNTRY,
        choices=settings.COUNTRIES,
        verbose_name=_('country')
    )

    objects = CountryManager()

    class Meta:
        abstract=True


class Product(CountryModelMixing):
    name = models.CharField(max_length=40)
Run Code Online (Sandbox Code Playgroud)

在我尝试的代码中:

Product.objects.get_special(name='abc')
Run Code Online (Sandbox Code Playgroud)

我收到了以下错误:

/opt/src/common/managers.py in get_special(self, *args, **kwargs)
     40         try:
     41             return self.get(*args, **kwargs)
---> 42         except …
Run Code Online (Sandbox Code Playgroud)

python django django-orm

0
推荐指数
1
解决办法
2095
查看次数

将Django 1.8中复杂子查询的结果注释为QuerySet

我必须遵循数据库架构:

main_account
- username

invoice
- amount
- currency: 'EUR' or 'USD' or 'GBP'
- username (main_account has many invoices)

我的目标是以美元列出"最高支付者".因此,我必须从发票表中计算每个用户的"total_paid"总和(并考虑货币转换).我也想通过这个"total_paid"来过滤.

我当前的SQL看起来像:

SELECT main_account.username, total_paid
FROM main_account JOIN
(
    SELECT username,
        (SELECT SUM(amount) FROM invoice WHERE main_account.username = invoice.username AND invoice.currency = 'EUR') AS total_eur,
        (SELECT SUM(amount) FROM invoice WHERE main_account.username = invoice.username AND invoice.currency = 'USD') AS total_usd,
        (SELECT SUM(amount) FROM invoice WHERE main_account.username = invoice.username AND invoice.currency = 'GBP') AS total_gbp,
        (SELECT (IFNULL(total_usd,0) + 1.12 * IFNULL(total_eur,0) + …
Run Code Online (Sandbox Code Playgroud)

mysql sql django django-orm django-queryset

0
推荐指数
1
解决办法
1524
查看次数

Django:我如何得到所有员工的查询集?

Django:我如何得到所有员工的查询集?

我尝试着:

staff = User.objects.get(is_staff=True)
Run Code Online (Sandbox Code Playgroud)

但得到一个TypeError:

'User' object is not iterable
Run Code Online (Sandbox Code Playgroud)

python django django-orm django-queryset

0
推荐指数
1
解决办法
4009
查看次数

我可以在Django中覆盖User.objects.delete吗?

我曾经在用户离开时删除了一个用户,但很多模型都与User有关,我需要设置相关的外键来清空或删除它们.

但是由于相关用户被删除,一些模型将毫无意义,例如Order.因此,我需要设置User.is_active或类似于无效而不是删除数据.

我认为这将是最好的如果我可以覆盖User.objects.delete,所以我不需要修改很多与之相关的业务功能.

python django django-orm

0
推荐指数
1
解决办法
131
查看次数

为什么在我的“多对多”Django 模型中没有采用 Django 的“add()”方法?

问题/问题:

我正在构建一个 Django 应用程序,有 2 个模型:UserSecret. 秘密可以由用户制作,其他用户可以“喜欢”它们。我已将我的likes字段设置为 a ManyToManyField,以便喜欢 Secret 的 Users 可以存储在那里并稍后检索等。但是,当我尝试查询 User 和 Secret 并使用时my_secret.likes.add(my_User) 什么也没有发生。我没有收到错误消息,当我打印我的 Secretmany-to-many likes字段时,添加后,我看到:secrets.User.None.

为什么我的add()方法正在运行,但我没有收到任何错误,为什么我的用户没有正确添加到我的 Secret 的赞中?

注意:我在最初创建时保存了 User 和 Secret 对象。在这个应用程序之外,我已经能够add()很好地使用该方法,但在那些场景中,我正在创建对象,而不是检索已经存在的对象。

add()使用从查询中检索到的数据时是否有不同的处理方式?这是我现在唯一的其他推理方式,我完全按照此处的文档进行操作:Django Many-to-Many Docs

如果在网站的其他地方回答了这个问题,我也深表歉意。我确实在这里找到了一篇文章,但没有提供解决方案,因为他们遇到了完全相同的问题。

我的模型:

class User(models.Model):
    """
    Creates instances of a `User`.

    Parameters:
    -`models.Model` - Django's `models.Model` method allows us to create new models.
    """ …
Run Code Online (Sandbox Code Playgroud)

python django many-to-many django-orm manytomanyfield

0
推荐指数
1
解决办法
1343
查看次数