标签: django-orm

使用Django ORM基于最大值获取单个子行

我有一个模型,"市场"与另一个模型有一对多的关系,"合同":

class Market(models.Model):
    name = ...
    ...

class Contract(models.Model):
    name= ...
    market = models.ForeignKey(Market, ...)
    current_price = ...
Run Code Online (Sandbox Code Playgroud)

我想以每个的最高价格获取市场对象以及合约.这是我通过原始SQL做的方式:

SELECT M.id as market_id, M.name as market_name, C.name as contract_name, C.price 
as price from pm_core_market M INNER JOIN
    (SELECT market_id, id, name, MAX(current_price) as price 
        FROM pm_core_contract GROUP BY market_id) AS C
ON M.id = C.market_id
Run Code Online (Sandbox Code Playgroud)

有没有办法在不使用SQL的情况下实现它?如果有的话,哪个应该是性能优先?

sql django inner-join django-orm

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

Django模型继承,过滤模型

给出以下模型:(不要介意TextFields只是为了说明)

class Base(models.Model):
   field1 = models.TextField()

   class Meta:
      abstract=True

class Child1(Base):
   child1_field = models.TextField()

class Child2(Base):
   child2_field = models.TextField()


class Content(models.Model):
    aso_items = models.ManyToManyField('Base')
Run Code Online (Sandbox Code Playgroud)

根据这些定义,Content对象可以与多个Base对象相关联,例如.面试(=内容对象)可以与音乐家(= Child1对象),电影导演(= Child2)等联系.

现在,对于我的问题:是否可以根据aso_items字段指向的模型过滤Content对象?例如:假设我想要一个Queryset,其中包含与Child1的特定对象相关联的所有Content对象(例如,与音乐家Bob Dylan相关的所有访谈),我该如何实现?

此外,如果我想要一个包含与Child1对象相关的所有Content对象的QuerySet,那该怎么办?(例如,所有与音乐家相关的访谈)如何改变过滤?

在此先感谢ps:我在预览中遇到了一些空白问题,原谅我

django django-models django-orm

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

Django ORM - 为DecimalField分配原始值

编辑!!!- 当我创建一个对象时,将值转换为字符串似乎工作正常,但是当我尝试编辑现有对象时,它不允许它.

所以我在我的一个Decimal模型中有一个十进制字段(3,2)

当我查询所有这些对象并尝试设置此字段时:

fieldName = 0.85
Run Code Online (Sandbox Code Playgroud)

要么

fieldName = .85
Run Code Online (Sandbox Code Playgroud)

它会抛出一个混乱,"无法将float转换为DecimalField,尝试首先转换为字符串"...

那么我做:

fieldName = str(0.85)
Run Code Online (Sandbox Code Playgroud)

同样的错误.

我甚至尝试过:

fieldName = "0.85"
Run Code Online (Sandbox Code Playgroud)

同样的错误.我在这里遇到某种框架错误,或者是什么?请注意,当我实际进入Django Admin并手动编辑对象时,它工作正常.

我在Python 2.6上运行Django 1.1

python django casting django-models django-orm

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

Django聚合查询相关的一对多对象

这是我的简化模型:

class Item(models.Model):
    pass

class TrackingPoint(models.Model):
    item = models.ForeignKey(Item)
    created = models.DateField()
    data = models.IntegerField()

    class Meta:
        unique_together = ('item', 'created')
Run Code Online (Sandbox Code Playgroud)

在我的应用程序的许多部分中,我需要检索一组Item并使用data字段TrackingPoint排序的每个项目中的最新字段来注释每个项目created.例如,i1类的实例Item有3个TrackingPoint:

tp1 = TrackingPoint(item=i1, created=date(2010,5,15), data=23)
tp2 = TrackingPoint(item=i1, created=date(2010,5,14), data=21)
tp3 = TrackingPoint(item=i1, created=date(2010,5,12), data=120)
Run Code Online (Sandbox Code Playgroud)

我需要一个查询来检索i1带有tp1.data字段值注释的实例,这tp1是按created字段排序的最新跟踪点.那个查询也应该返回Item没有任何问题TrackingPoint的查询.如果可能的话我不喜欢使用QuerySetextra方法来做到这一点.

这就是我到目前为止所尝试的......并且失败了:(

Item.objects.annotate(max_created=Max('trackingpoint__created'),
                      data=Avg('trackingpoint__data')).filter(trackingpoint__created=F('max_created'))
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

python django orm django-orm django-aggregation

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

如何删除只有m2m的关系?

模型:

class Province(models.Model):
    user = models.ManyToManyField(User, blank=True)
    name = models.CharField(max_length=30, unique=True)

class City(models.Model):
    name = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, editable=False, unique=False)
    ownership = models.ManyToManyField(User, through='UserCity')


class UserCity(models.Model):
    user = models.ForeignKey(User)
    province = models.ForeignKey(Province)
    city = models.ForeignKey(City)


class District(models.Model):
    name = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, unique=True, editable=False)
    ownership = models.ManyToManyField(User, through='UserDistrict')

class UserDistrict(models.Model):
    user = models.ForeignKey(User)
    province = models.ForeignKey(Province)
    city = models.ForeignKey(City)
    district = models.ForeignKey(District)
Run Code Online (Sandbox Code Playgroud)

当我知道user_id和province_id时,如何删除关系?如果我用户delete()方法它也删除省,我想避免它.我找不到任何地方如何删除m2m字段中的1个特定关系.

django django-models django-orm

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

检查非可空字段是否为空(Django)

我想写一些像这样的代码:

class SomeModel(models.Model):

    field = models.ForeignKey(SomeOtherModel)

    def __init__(self, *args, **kwargs):
        super(SomeModel, self).__init__(*args, **kwargs)
        if self.field is None:
            self.field = SomeOtherModel()

    ...
Run Code Online (Sandbox Code Playgroud)

然而,这提高了self.field.rel.to.DoesNotExist.Django代码非常明确:

class ReverseSingleRelatedObjectDescriptor(object):

    def __get__(self, instance, instance_type=None):

        ...

        if val is None:
            # If NULL is an allowed value, return it.
            if self.field.null:
                return None
            raise self.field.rel.to.DoesNotExist
Run Code Online (Sandbox Code Playgroud)

我几乎可以肯定这个问题之前已经提出过,但不知怎的,我无法找到任何与该特定用例匹配的东西.一个明显的解决方法当然是使字段可以为空,但据我所知,实际上会对数据库模式产生影响,我也喜欢Django提供的完整性检查.另一个是捕获异常并适当处理它.然而,这增加了许多样板代码.特别是当有多个像这样的字段时(try...except每个字段都有一个单独的块 - 现在这很难看).你会建议什么?

编辑:另一件事 - 我可以使用initial但是当涉及到外键时这是非常有限的.我并不总是知道在创作时我想要的默认类型.但是我会在初始化阶段知道它.而且,它可能依赖于其他字段的值.

python django null django-models django-orm

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

Django模型字段的随机值

所以我能够使用uuid生成一个随机id到目前为止这么好但是当我尝试数据库时我得到相同的值

 def f():
    d = uuid4()
    str = d.hex
    return str[0:16]
Run Code Online (Sandbox Code Playgroud)
class Q(models.Model):
  a = models.CharField(max_length=150)
  b = models.IntegerField(max_length=25)
  c = models.IntegerField(max_length=32 , default=0)
  d = models.ManyToManyField(Ans , related_name='aa')
  e = models.CharField(max_length=18 , default = f() ,unique=True )


class Ans(models.Model):
  sub = models.CharField(max_length=150) 


-----------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

而且我这样插入

def ins(request):
     t =random.randint(0, 1000)
     p = Q(a = t , b=0 , c=0)
     p.save()
     return HttpResponse('Saved')
Run Code Online (Sandbox Code Playgroud)

只是好奇这里到底发生了什么

旁注:如果我设置e.unique = False,在获得新的UUID值之前,我会使用相同的e值获得2-3

python django django-models django-orm

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

如何判断您的选择查询是否在交易中?

在Django 1.5.x中,我有一个长时间运行的管理命令,其中选择查询返回过时数据.我怀疑这是因为它们是在db connnection早期启动的事务中运行的.有没有办法判断查询是在事务中运行还是处于自动提交模式?

(这是我在/sf/ask/1297806961/上发布的早期问题的更集中的版本)

django django-orm

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

通过django orm计数(*)来制作组

使用以下型号:

class Day(models.Model):
    date = models.DateField(
        unique=True,
        null=False,
        blank=False,
    )


class Reservation(models.Model):
    user = models.ForeignKey(
        User,
        null=False,
        blank=False,
        related_name='reservations',
        verbose_name=_('Utilisateur'),
    )
    day = models.ForeignKey(
        Day,
        null=False,
        blank=False,
        related_name='reservations',
    )
Run Code Online (Sandbox Code Playgroud)

要获得预订数量低于或等于5的天数,我会:

SELECT day_id
FROM meal_reservation
GROUP BY day_id
HAVING count(*) <= 5
Run Code Online (Sandbox Code Playgroud)

但是如何使用Django ORM呢?

django django-orm

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

Django中显示所有属于创建对象的属性值的方法?

Django中是否有某种方法可以检索/显示属于通过Django创建的对象的所有属性的值?

在Python Shell中,我使用了以下命令:

>>> print(p.first_name, p.last_name, p.software_name)
Linus Torvalds Linux
Run Code Online (Sandbox Code Playgroud)

p是具有first_name,last_name,software_name属性的已创建对象。我已经创建了几个模型,这些模型已应用于mysql中的特定数据库。

我想学习其他显示此类信息的方法。

django django-orm python-3.x

3
推荐指数
4
解决办法
3386
查看次数