【问题标题】:Python/Django : TypeError : __str__ returned non-string (type UUID)Python/Django:TypeError:__str__ 返回非字符串(UUID 类型)
【发布时间】:2016-11-30 02:02:22
【问题描述】:

我创建了一个子模型,它有一个与父模型相关的ForeignKey 实例“父”。我想将一个孩子与 Post 联系起来。为此,在我的表单中,我为“父”字段创建了一个ModelChoiceField。因此,为了在我的模板中呈现它,我将一些内容作为我的以下代码。当我运行代码时,它会引发错误:

TypeError : str 返回非字符串(UUID 类型)。

如果能帮助我解决此错误,我将不胜感激。

这是我的代码:

模型.py:

class Parent(models.Model):

    parent_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
    from1 = models.CharField(max_length=20)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)

    objects = ParentManager()

    def __str__(self):
        return self.parent_id

    def get_absolute_url(self):
        return reverse("detail", kwargs={"id": self.parent_id})


class Child(models.Model):

    child_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    parent = models.ForeignKey(Parent, default=uuid.uuid4, related_name='childs' )
    user = models.OneToOneField(settings.AUTH_USER_MODEL, null=True, blank=True, unique=False)
    amount = models.IntegerField()

    def get_absolute_url(self):
        return reverse("accept_child", kwargs={"child_id": self.child_id})

    def __unicode__(self):
        return self.amount

    def __str__(self):
        return self.amount

forms.py:

 class ChildForm(forms.ModelForm):

    parent = forms.ModelChoiceField(queryset= Parent.objects.all(), label="Parent", widget=forms.RadioSelect(), initial=0)
    amount = forms.IntegerField(help_text='Place the child for a Parent')

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(ChildForm, self).__init__(*args, **kwargs)
        self.fields['parent'].queryset = Parent.objects.all()

    class Meta:
        model = Child
        fields = ["amount"]

模板:

<td > {% for choice in form.parent.field.choices %} 
<li><input type="radio" name="{{ choice.parent }}" value="{{ choice.0 }}" />
<label for="">{{choice.1}}</label></li>
{% endfor %}</td>

更新 1:

views.py:

def live_bid_truck(request):

form = ChildForm(request.POST or None)

if  form.is_valid():
    child = form.save(commit=False)

    print(form.cleaned_data.get("amount"))
    child.user = request.user # YOU SET THE USER 
    child.parent = ?? # I DON'T HOW TO SET THE PARENT HERE, 


    child.save()


    print(child.parent.id)

【问题讨论】:

  • 您需要在您的ChildForm 中使用self.fields['parent'].queryset = Parent.objects.all()。注意()
  • 谢谢。我错过了括号。现在,我收到一个错误:str 返回非字符串(UUID 类型),因为我使用 UUID 作为主键。我可以知道我为什么会得到这个吗?
  • 将其用作 str(uuid 字段)。
  • 恕我直言,最好在另一个问题中问这个,以避免污染。或者您可以更改您原来的问题。
  • @PiyushS.Wanare 我应该在我的父模型中保留 str(uuid field) 吗?

标签: django django-models django-forms django-templates


【解决方案1】:

这可能会对您有所帮助:

如果您想根据前端接受的主键在主键字段表中写入内容,请使用以下代码。

import uuid
uuidField = uuid.UUID(uuidField)

如果您想请求数据库并将该输出发送到前端,请将其用作 str(uuidField) 否则它将不会被序列化。并且会给你错误。

如下修改:

def __str__(self):
    return str(self.parent_id)

【讨论】:

  • 我应该在哪里使用这个?作为父模型中的新字段?
  • 我仍然遇到同样的错误。实际上 uuidField = uuid.UUID(uuidField) 在这里有什么作用?我应该将它包含在我的代码中的某个地方吗?
  • 这就是当您需要在 uuid 字段的表中添加一些行作为前端将其作为 str 发送时,为了进行比较,您需要在 uuid 中更改它。
  • 是的,兄弟。我有一个问题,如何在 ChildForm 下的视图中保存实例“父级”?我用我的观点更新了这个问题。一分钟后看看。
  • 在我的页面中,我在表的每一行中都获得了整个查询集。如何按行分隔这些选择?
猜你喜欢
  • 2020-09-15
  • 2018-03-02
  • 1970-01-01
  • 2020-04-19
  • 2018-08-16
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多