标签: django-models

Django动态模型字段

我正在开发一个多租户应用程序,其中一些用户可以定义自己的数据字段(通过管理员)以收集表单中的其他数据并报告数据.后一位使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)

python django dynamic django-models django-custom-manager

156
推荐指数
2
解决办法
6万
查看次数

在django模型自定义save()方法中,您应该如何识别新对象?

我想在保存新记录(不更新现有记录)时在Django模型对象的save()方法中触发特殊操作.

检查(self.id!= None)是否必要且足以保证自我记录是新的而不是更新?这可能会忽略任何特殊情况?

django django-models

152
推荐指数
8
解决办法
6万
查看次数

如何在Django中表达一对多的关系

我正在定义我的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,但关系应该是单向的,因为我不需要知道PhoneNumberDude拥有它本身,因为我可能有很多不同的对象拥有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中表达这个?

django django-models

150
推荐指数
6
解决办法
16万
查看次数

在Django中,如何使用动态字段查找过滤QuerySet?

给出一个类:

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)

python django django-models

148
推荐指数
4
解决办法
5万
查看次数

如何限制Django模型中数字字段的最大值?

Django有各种可用于模型的数字字段,例如DecimalFieldPositiveIntegerField.虽然前者可以限制在存储小数位的数量和字符的存储总数,有没有办法将其限制于存储在一定范围内的数字,如0.0-5.0?

如果失败了,有没有办法限制一个PositiveIntegerField只存储,例如,最多50个数字?

更新:现在Bug 6845 已经关闭,这个StackOverflow问题可能没什么问题. - sampablokuper

python django numbers django-models

144
推荐指数
6
解决办法
12万
查看次数

使用Django/South重命名模型的最简单方法?

我一直在寻找南方网站,谷歌和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)

为了简单起见,我只是尝试将名称从更改FooBar,但暂时忽略该foo成员FooTwo.

使用南方最简单的方法是什么?

  1. 我可能会进行数据迁移,但这似乎很复杂.
  2. 编写自定义迁移,例如db.rename_table('city_citystate', 'geo_citystate'),但在这种情况下我不确定如何修复外键.
  3. 你知道一种更简单的方法吗?

python django rename django-models django-south

141
推荐指数
3
解决办法
3万
查看次数

从数据库重新加载django对象

是否可以从数据库刷新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 .还是不明白为什么维护者不喜欢这个.

python django django-models

141
推荐指数
4
解决办法
6万
查看次数

为什么django的model.save()不调用full_clean()?

我只是好奇是否有人知道django的orm是否有充分理由不在模型上调用'full_clean',除非它被保存为模型表单的一部分.

请注意,调用模型的save()方法时,不会自动调用full_clean().如果要为自己手动创建的模型运行一步模型验证,则需要手动调用它. django完全干净的文档

(注意:为Django 1.6更新了引用...以前的django文档也有关于ModelForms的警告.)

有没有充分的理由让人们不想要这种行为?我想如果你花时间为模型添加验证,那么每次保存模型时都需要运行验证.

我知道如何使一切正常工作,我只是在寻找解释.

python django django-models django-validation

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

如何在Django中序列化模型实例?

有很多关于如何序列化模型查询集的文档,但是如何将模型实例的字段序列化为JSON?

python django serialization json django-models

140
推荐指数
10
解决办法
12万
查看次数

Django过滤器与单个对象的获取?

我和一些同事正在讨论这个问题.当你期望只有一个对象时,有没有一种首选的方法来检索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 django-models django-queryset

137
推荐指数
8
解决办法
8万
查看次数