【问题标题】:Cannot assign must be a instance Django不能分配必须是实例 Django
【发布时间】:2014-10-27 02:09:10
【问题描述】:

我有一个订单表格,它返回这个提交声明:

Cannot assign "<Annual: 2012>": "Order.annuals" must be a "Catalog" instance.

我对 Django 还很陌生。我知道它需要一个实例而不是它已传递的字符串。我将如何解决这个问题?

这是我的看法:

class OrderListCreateView(
  views.LoginRequiredMixin,
  views.SetHeadlineMixin,
  generic.CreateView
     ):
  form_class = forms.OrderListForm
  headline = 'Create'
  model = Order
  template_name = 'ordercreate.html'


  def form_valid(self, form):
    self.object = form.save(commit=False)
    self.object.user = self.request.user
    self.object.save()
    return super(OrderListCreateView, self).form_valid(form)

这是我的表格:

class OrderListForm(forms.ModelForm):

annuals = forms.ModelChoiceField(queryset=Annual.objects.all())
issues = forms.ModelChoiceField(queryset=Issue.objects.all())
articles = forms.ModelChoiceField(queryset=Article.objects.all())

class Meta:
    fields = (
                'annuals',
                'issues',
                'articles',)
    model = models.Order

def __init__(self, *args, **kwargs):
    super(OrderListForm, self).__init__(*args, **kwargs)
    self.helper = FormHelper()
    self.helper.layout = Layout(
                'annuals',
                'issues',
                'articles',
        ButtonHolder(
            Submit('create', 'Create')

        )

    )

这是我的模型:

class Catalog(models.Model):
    products = models.CharField(max_length=200)

    def __unicode__(self):
        return self.products


class Issue(models.Model):
    catalog = models.ForeignKey(Catalog, related_name='issue_products')
    Volume = models.DecimalField(max_digits=3, decimal_places=1)

    def __unicode__(self):
        return unicode(self.Volume)


class Annual(models.Model):
    catalog = models.ForeignKey(Catalog, related_name='annual_products')
    year_id = models.IntegerField(max_length=4)
    start_date = models.CharField(max_length=6)
    end_date = models.CharField(max_length=6)
    def __unicode__(self):
        return unicode(self.year_id)

    #def __unicode__(self):
    #    return unicode(self.id)

class Annual_Issue(models.Model):
    annual_id = models.ForeignKey(Annual, related_name='annual_ids')
    issue_id = models.ForeignKey(Issue, related_name='issues')
    def __unicode__(self):
        return self.annual_id


class Article(models.Model):
    catalog = models.ForeignKey(Catalog, related_name='article_products')
    title = models.CharField(max_length=200)
    abstract = models.TextField(max_length=1000, blank=True)
    full_text = models.TextField(blank=True)
    proquest_link = models.CharField(max_length=200, blank=True, null=True)
    ebsco_link = models.CharField(max_length=200, blank=True, null=True)

    def __unicode__(self):
        return self.title


class Order(models.Model):
    user = models.ForeignKey(User, related_name='who_ordered')
    annuals = models.ForeignKey(Catalog, related_name='annuals_ordered', blank=True, null=True)
    issues = models.ForeignKey(Catalog, related_name='issues_ordered', blank=True, null=True)
    articles = models.ForeignKey(Catalog, related_name='items_ordered', blank=True, null=True)

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    在您的 Order 模型中,您已经为其他几个模型(Annual、Issue 和 Article)定义了 ForeignKey 关系,但是这些关系中的每一个都指向 Catalog 模型。当您尝试保存表单创建的 Order 实例时,它已接收到这些类型的对象(Annual、Issue 和 Article),但它无法在 Order 模型上定义的字段中存储对这些对象的外键引用。这是因为 Order 上的外键字段要求它们只能包含对 Catalog 对象的引用。

    如果对于这些外键关系中的每一个,您希望存储这些不同类型的对象中的一种,则需要更改 Order 模型定义以期望引用这些模型的对象而不是 Catalog 对象。

    简而言之,我建议修改 Order 模型以包含以下关系。这将允许订单对象存储对彼此类型(Annual、Issue 和 Article)对象的单个引用。

    annuals = models.ForeignKey(Annual, related_name='annuals_ordered', blank=True, null=True)
    issues = models.ForeignKey(Issue, related_name='issues_ordered', blank=True, null=True)
    articles = models.ForeignKey(Article, related_name='items_ordered', blank=True, null=True)
    

    有关 Django 中的 ForeignKey 关系的更多信息,see the reference here

    【讨论】:

    • 谢谢!这是有道理的。
    • 我知道这是旧的,但我只想说这是我为这个错误找到的最清楚的解释。非常感谢你让我摆脱困境!
    猜你喜欢
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 2015-01-05
    • 2013-12-18
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多