我正在开发一个多租户应用程序,其中一些用户可以定义自己的数据字段(通过管理员)以收集表单中的其他数据并报告数据.后一位使JSONField不是一个很好的选择,所以我有以下解决方案:
class CustomDataField(models.Model):
"""
Abstract specification for arbitrary data fields.
Not used for holding data itself, but metadata about the fields.
"""
site = models.ForeignKey(Site, default=settings.SITE_ID)
name = models.CharField(max_length=64)
class Meta:
abstract = True
class CustomDataValue(models.Model):
"""
Abstract specification for arbitrary data.
"""
value = models.CharField(max_length=1024)
class Meta:
abstract = True
Run Code Online (Sandbox Code Playgroud)
请注意CustomDataField如何具有ForeignKey to Site - 每个站点将具有一组不同的自定义数据字段,但使用相同的数据库.然后,各种具体数据字段可以定义为:
class UserCustomDataField(CustomDataField):
pass
class UserCustomDataValue(CustomDataValue):
custom_field = models.ForeignKey(UserCustomDataField)
user = models.ForeignKey(User, related_name='custom_data')
class Meta:
unique_together=(('user','custom_field'),)
Run Code Online (Sandbox Code Playgroud)
这导致以下用途:
custom_field = UserCustomDataField.objects.create(name='zodiac', site=my_site) #probably created …Run Code Online (Sandbox Code Playgroud) 我想在保存新记录(不更新现有记录)时在Django模型对象的save()方法中触发特殊操作.
检查(self.id!= None)是否必要且足以保证自我记录是新的而不是更新?这可能会忽略任何特殊情况?
我正在定义我的Django模型,我意识到OneToManyField模型字段类型中没有.我确定有办法做到这一点,所以我不确定我错过了什么.我基本上有这样的事情:
class Dude(models.Model):
numbers = models.OneToManyField('PhoneNumber')
class PhoneNumber(models.Model):
number = models.CharField()
Run Code Online (Sandbox Code Playgroud)
在这种情况下,每个都Dude可以有多个PhoneNumbers,但关系应该是单向的,因为我不需要知道PhoneNumber它Dude拥有它本身,因为我可能有很多不同的对象拥有PhoneNumber实例,例如Businessfor例:
class Business(models.Model):
numbers = models.OneToManyField('PhoneNumber')
Run Code Online (Sandbox Code Playgroud)
我会OneToManyField在模型中用什么替换(哪些不存在)来表示这种关系?我来自Hibernate/JPA,宣布一对多的关系就像:
@OneToMany
private List<PhoneNumber> phoneNumbers;
Run Code Online (Sandbox Code Playgroud)
我怎么能在Django中表达这个?
给出一个类:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=20)
Run Code Online (Sandbox Code Playgroud)
是否有可能,如果有的话,如何使用基于动态参数进行过滤的QuerySet?例如:
# Instead of:
Person.objects.filter(name__startswith='B')
# ... and:
Person.objects.filter(name__endswith='B')
# ... is there some way, given:
filter_by = '{0}__{1}'.format('name', 'startswith')
filter_value = 'B'
# ... that you can run the equivalent of this?
Person.objects.filter(filter_by=filter_value)
# ... which will throw an exception, since `filter_by` is not
# an attribute of `Person`.
Run Code Online (Sandbox Code Playgroud) Django有各种可用于模型的数字字段,例如DecimalField和PositiveIntegerField.虽然前者可以限制在存储小数位的数量和字符的存储总数,有没有办法将其限制于存储只在一定范围内的数字,如0.0-5.0?
如果失败了,有没有办法限制一个PositiveIntegerField只存储,例如,最多50个数字?
更新:现在Bug 6845 已经关闭,这个StackOverflow问题可能没什么问题. - sampablokuper
我一直在寻找南方网站,谷歌和SO的答案,但找不到一个简单的方法来做到这一点.
我想用South重命名一个Django模型.说你有以下内容:
class Foo(models.Model):
name = models.CharField()
class FooTwo(models.Model):
name = models.CharField()
foo = models.ForeignKey(Foo)
Run Code Online (Sandbox Code Playgroud)
并且你想将Foo转换为Bar,即
class Bar(models.Model):
name = models.CharField()
class FooTwo(models.Model):
name = models.CharField()
foo = models.ForeignKey(Bar)
Run Code Online (Sandbox Code Playgroud)
为了简单起见,我只是尝试将名称从更改Foo为Bar,但暂时忽略该foo成员FooTwo.
使用南方最简单的方法是什么?
db.rename_table('city_citystate', 'geo_citystate'),但在这种情况下我不确定如何修复外键.是否可以从数据库刷新django对象的状态?我的意思是行为大致相当于:
new_self = self.__class__.objects.get(pk=self.pk)
for each field of the record:
setattr(self, field, getattr(new_self, field))
Run Code Online (Sandbox Code Playgroud)
更新:在跟踪器中找到了重新打开/未修正的战争:http://code.djangoproject.com/ticket/901 .还是不明白为什么维护者不喜欢这个.
我只是好奇是否有人知道django的orm是否有充分理由不在模型上调用'full_clean',除非它被保存为模型表单的一部分.
请注意,调用模型的save()方法时,不会自动调用full_clean().如果要为自己手动创建的模型运行一步模型验证,则需要手动调用它. django完全干净的文档
(注意:为Django 1.6更新了引用...以前的django文档也有关于ModelForms的警告.)
有没有充分的理由让人们不想要这种行为?我想如果你花时间为模型添加验证,那么每次保存模型时都需要运行验证.
我知道如何使一切正常工作,我只是在寻找解释.
有很多关于如何序列化模型查询集的文档,但是如何将模型实例的字段序列化为JSON?
我和一些同事正在讨论这个问题.当你期望只有一个对象时,有没有一种首选的方法来检索Django中的对象?
两个明显的方法是:
try:
obj = MyModel.objects.get(id=1)
except MyModel.DoesNotExist:
# We have no object! Do something...
pass
Run Code Online (Sandbox Code Playgroud)
和
objs = MyModel.objects.filter(id=1)
if len(objs) == 1:
obj = objs[0]
else:
# We have no object! Do something...
pass
Run Code Online (Sandbox Code Playgroud)
第一种方法似乎在行为上更正确,但在控制流中使用异常可能会引入一些开销.第二个更环形,但不会引发异常.
关于哪一个更好的想法?哪个更有效率?
django ×10
django-models ×10
python ×7
django-south ×1
dynamic ×1
json ×1
numbers ×1
rename ×1