我认为问这个问题的最好方法是使用一些代码......我可以这样做吗?(编辑:答案:不)
class MyModel(models.Model):
foo = models.CharField(max_length = 20)
bar = models.CharField(max_length = 20)
def get_foo(self):
if self.bar:
return self.bar
else:
return self.foo
def set_foo(self, input):
self.foo = input
foo = property(get_foo, set_foo)
Run Code Online (Sandbox Code Playgroud)
或者我必须这样做:
class MyModel(models.Model):
_foo = models.CharField(max_length = 20, db_column='foo')
bar = models.CharField(max_length = 20)
def get_foo(self):
if self.bar:
return self.bar
else:
return self._foo
def set_foo(self, input):
self._foo = input
foo = property(get_foo, set_foo)
Run Code Online (Sandbox Code Playgroud)
注意:通过将db_column传递给模型字段,可以将列名保留为数据库中的'foo'.当您处理现有系统并且不希望无缘无故地进行数据库迁移时,这非常有用
我试图用python属性设置一个Django模型,如下所示:
class Post(models.Model):
_summary = models.TextField(blank=True)
body = models.TextField()
@property
def summary(self):
if self._summary:
return self._summary
else:
return self.body
@summary.setter
def summary(self, value):
self._summary = value
@summary.deleter
def summary(self):
self._summary = ''
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利,在控制台中我可以与摘要属性进行交互.但是当我尝试用它做任何事情时,就像Post(title="foo", summary="bar")它一样,它会引发一种契合.有没有办法让Django与Python属性玩得很好?
在这个链接中(对于ReadOnlyField):http://www.django-rest-framework.org/api-guide/fields/#readonlyfield它说"当包含与一个相关的字段名称时,默认情况下使用此字段与ModelSerializer属性而不是模型字段".话虽如此,你能给我一个模型字段名称的例子,它是一个"属性",一个模型字段名称是一个"字段"吗?
在SQLAlchemy中,混合属性是应用于ORM映射类的属性或方法,
class Interval(Base):
__tablename__ = 'interval'
id = Column(Integer, primary_key=True)
start = Column(Integer, nullable=False)
end = Column(Integer, nullable=False)
def __init__(self, start, end):
self.start = start
self.end = end
@hybrid_property
def length(self):
return self.end - self.start
@hybrid_method
def contains(self,point):
return (self.start <= point) & (point < self.end)
@hybrid_method
def intersects(self, other):
return self.contains(other.start) | self.contains(other.end)
Run Code Online (Sandbox Code Playgroud)
这允许在类和实例级别执行不同的行为,从而使使用相同代码评估SQL语句变得更加简单,
>>> i1 = Interval(5, 10)
>>> i1.length
5
>>> print Session().query(Interval).filter(Interval.length > 10)
SELECT interval.id AS interval_id, interval.start AS …Run Code Online (Sandbox Code Playgroud) 这与这个问题非常相似,但不幸的是,我仍然无法让它工作。
我有一个模型,其属性组合了几个字段:
class Specimen(models.Model):
lab_number = ...
patient_name = ...
specimen_type = ...
@property
def specimen_name(self):
return f"{self.lab_number}_{self.patient_name}_{self.specimen_type}"
Run Code Online (Sandbox Code Playgroud)
在 Django Admin 中,当有人进行搜索时,我可以使用search_fieldsModel Admin 中的属性来指定真实字段,但不能指定specimen_name自定义字段:
def specimen_name(inst):
return inst.specimen_name
specimen_name.short_description = "Specimen Name"
class SpecimenModelAdmin(admin.ModelAdmin):
list_display = ('specimen_name', 'patient_name', 'lab_number', 'specimen_type')
search_fields = ('patient_name', 'lab_number', 'specimen_type')
Run Code Online (Sandbox Code Playgroud)
使用上面的代码进行搜索,它将搜索各个字段,但如果我尝试在 Django Admin 中搜索完整的标本名称,它不会找到它,因为没有一个字段包含准确的完整标本名称。
我上面链接的 SO 问题为我指明了正确的方向 - 使用get_search_results. 我的代码现在看起来像这样:
class SpecimenModelAdmin(admin.ModelAdmin):
...
search_fields = ('patient_name', 'lab_number', 'specimen_type')
def get_search_results(self, request, queryset, search_term):
if not search_term:
return …Run Code Online (Sandbox Code Playgroud) 我是Python和Django Development的新手,我从社区提供的简单阅读示例中学到了很多东西.但最近我想为Django附带的管理控制台实现自定义管理过滤器.我搜索了很多,只发现了一些过时的方法来完成它.例如: Django 1.3或更低版本的Django Admin中的自定义过滤器
我尝试在'django.contrib.admin'应用程序中阅读过滤器模块的源代码,但遗憾的是我很难理解代码背后的基本原理.所以我想知道某些人是否可以提供一些例子或参考这个问题---如何在Django 1.4中自定义管理过滤器?
提前致谢!
我有一个按开始日期和持续时间(以天为单位)定义订阅期的模型:
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 ×7
python ×6
database ×1
django-admin ×1
django-orm ×1
model ×1
orm ×1
postgresql ×1
properties ×1
sqlalchemy ×1