我有一个模型,"市场"与另一个模型有一对多的关系,"合同":
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的情况下实现它?如果有的话,哪个应该是性能优先?
给出以下模型:(不要介意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:我在预览中遇到了一些空白问题,原谅我
编辑!!!- 当我创建一个新对象时,将值转换为字符串似乎工作正常,但是当我尝试编辑现有对象时,它不允许它.
所以我在我的一个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
这是我的简化模型:
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的查询.如果可能的话我不喜欢使用QuerySet的extra方法来做到这一点.
这就是我到目前为止所尝试的......并且失败了:(
Item.objects.annotate(max_created=Max('trackingpoint__created'),
data=Avg('trackingpoint__data')).filter(trackingpoint__created=F('max_created'))
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
模型:
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个特定关系.
我想写一些像这样的代码:
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但是当涉及到外键时这是非常有限的.我并不总是知道在创作时我想要的默认类型.但是我会在初始化阶段知道它.而且,它可能依赖于其他字段的值.
所以我能够使用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
在Django 1.5.x中,我有一个长时间运行的管理命令,其中选择查询返回过时数据.我怀疑这是因为它们是在db connnection早期启动的事务中运行的.有没有办法判断查询是在事务中运行还是处于自动提交模式?
(这是我在/sf/ask/1297806961/上发布的早期问题的更集中的版本)
使用以下型号:
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创建的对象的所有属性的值?
在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 ×10
django-orm ×10
python ×4
casting ×1
inner-join ×1
null ×1
orm ×1
python-3.x ×1
sql ×1