我正在创建用户活动流。
活动模型:
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) 我有一个按开始日期和持续时间(以天为单位)定义订阅期的模型:
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) 根据 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。我找不到办法。除了手动更改列
我想基于模型的两个字段进行查询,日期,偏移量为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实现它们.
这听起来很明智,就像应该有一个快速简单的方法 - 但我已经无果而终地寻找如何做太久的事情 - 任何人都知道答案?
我们正在尝试从 to 迁移commit_manually,atomic以便我们可以在遗留项目中将 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 我们也将例外用于“提前退出”,并且移动到某些标志等会带来混乱的日志,我个人很想避免它。
我在主页上显示 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's执行聚合函数RangeField?
假设我们有 3 个带有BigIntegerField price_range.
第一个对象: price_range = [10,5000]
第二个对象: price_range = [1,5000]
第三个对象: price_range = [100,9000]
这三个对象的结果Max和Min聚合将是:
min = 1 和 max = 9000
我试图聚集Max和Min这种方式:
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...
例如,有这样的类:
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 查询字段名称有双下划线的地方。这是因为在 django 中查询语言__有其自身的含义
那么如何查询实际名称为 的字段"my__fyeild__name"呢?
template.fields.filter(my__fyeild__name="aaa")
Run Code Online (Sandbox Code Playgroud)
在数据库中,该列的名称带有两个下划线__,我不允许重命名该列。
我正在运行一个每天创建数百万条记录的程序,运行该程序一年多后,似乎我已经达到了 postgres 数据库的 id 限制。
我收到的错误是
django.db.utils.DataError:nextval:达到序列“main_records_id_seq”的最大值(2147483647)
有没有办法使用 SQL 或 django ORM 来扩展最大 id?或者有更好的解决方案吗?
django ×10
django-orm ×10
postgresql ×4
python ×3
orm ×2
django-views ×1
mysql ×1
sql ×1
transactions ×1