在调用save方法之前创建一个对象

时间:2010-11-27 18:50:45

标签: python django django-models

我想在调用save方法之前在Django中创建一个对象。这个对象将从ForeignKey值创建,我已将foreignkey字段更改为输入字段,以便写入值而不是选择它。

我在2个不同的模型文件中有2个类

class Category(models.Model):
    title = models.ForeignKey(Title, verbose_name="Title")

class Title(models.Model):
    title = models.CharField("Title", primary_key=True, max_length=200)

当我创建一个类别时,我必须选择或写一个已经存在于数据库中的标题,当我尝试使用新标题创建一个类别时,我收到此错误:

Select a valid choice. That choice is not one of the available choices.

我想要做的是在创建类别之前根据我在ForeignKey字段中编写的内容创建标题,以便可以立即使用它。

我尝试重新定义save方法以在保存类别之前保存标题对象,但它不起作用。

任何帮助都将非常感激。

谢谢

3 个答案:

答案 0 :(得分:1)

在表单验证后执行保存,您可以在验证期间创建类别obj。

查看表单字段的干净方法,您可以在django docs http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other上覆盖

答案 1 :(得分:1)

感谢您的代码,我刚刚测试过它。但这并不是我想要的,我会解释我想做什么。

假设我们的模型中有Category和Article类,每个类都有一个标题。为了使这个标题可重用,我创建了另一个将管理字段的应用程序,我创建了类Title,并将其作为foreignkey添加到Category和Article表单中。

我使用raw_id_fields将选择框切换到输入字段。

现在,当我创建一个类别或文章时,我必须选择或写一个标题,当这个标题存在时,它完美地工作但是当它不存在时我想在创建类别之前创建它以便它可以用它。

我尝试在save方法,pre_save信号和clean方法中执行此操作,但我总是收到错误“选择有效选项。该选项不是可用选项之一。”

我现在正在使用硬编码解决方案来创建标题,我想看看它是否可行,这些是我在创建类别之前在不同方法中创建标题的行:

t = Title(title = "MyTitle")
t.save()

我尝试使用MyTitle作为标题创建一个类别但是我得到了相同的错误,当我尝试使用现有标题创建另一个时,它可以工作并创建标题“MyTitle”。这意味着对象的创建发生在表单验证之后。我想要的只是以前这样做。应在验证之前创建标题对象。

非常感谢您的帮助

答案 2 :(得分:-1)

您应该考虑将代码放在模型管理器中创建Category条目:

class CategoryManager(Manager):
    def create_category(category, title):
        t = Title.objects.get_or_create(title=title)
        return self.create(title=t)

class Category(models.Model):
    title = models.ForeignKey(Title, verbose_name="Title")
    objects = CategoryManager()

每次要创建类别时都使用create_category。