【问题标题】:Assign value to one-to-many field through django code通过django代码为一对多字段赋值
【发布时间】:2020-02-08 03:51:38
【问题描述】:

我正在尝试为使用models.ForeignKey 定义的数据库条目分配值。我应该如何引用引用模型中的变量?

在下面的代码中,赋值update_user.appointments.requester_name = requesting_user 不起作用。谷歌搜索并没有帮助我找到正确的解决方案。应该如何从 django/python 中引用这些变量?

下面是我的models.py

class AppointmentRequest(models.Model):
    my_name = models.TextField(default='')
    requester_name = models.TextField(default='')
    meeting_year = models.TextField(default='')


class CustomUser(AbstractUser):
    firstname = models.TextField(default='')
    lastname = models.TextField(default='')
    appointments = models.ForeignKey(AppointmentRequest, on_delete=models.CASCADE, default='', blank=True, null=True)

我想修改约会条目的值,即 my_name、requester_name 等。

下面是views.py中的代码

def book_appointment(request):
    requesting_user = request.GET['requesting_user']
    update_user = CustomUser.objects.get(username=requested_user)
    update_user.appointments.requester_name = requesting_user

【问题讨论】:

  • 对我来说看起来不错,只是在设置值后注意保存,update_user.appointments.save()
  • 我得到的错误是AttributeError: 'NoneType' object has no attribute 'requester_name'. On this line: update_user.appointments.requester_name = requesting_user`
  • 所以,外键没有指向任何实例,它的值为None,确保FK中有一些值

标签: django sqlite django-models


【解决方案1】:

您可能获得“NoneType”对象没有属性“requester_name”的原因是 update_user.appointments 可能为空

appointments = models.ForeignKey(AppointmentRequest, on_delete=models.CASCADE, default='', blank=True, null=True)

这表示您的 ForeignKey 可以为空,所以它可能会返回给您。

你真正应该做的是:

if update_user.appointments:
    update_user.appointments.requester_name  = request.GET['requesting_user']
else:
    apt_request = AppointmentRequest()
    apt_request.requester_name = request.GET['requesting_user']
    apt_request.save()
    update_user.appointments = apt_request()

update_user.save()

这将创建一个 AppointmentRequest 对象,您可以使用它来设置约会 ForeignKey IF update_user.appointments 为空。

另外,在这段代码中:

appointments = models.ForeignKey(AppointmentRequest, on_delete=models.CASCADE, default='', blank=True, null=True)

我很确定 default='' 什么都不做,它默认为 null。所以你可以省略那部分代码。

在 cmets 中继续...: 哦。另一件事。我不会为此使用 ForeignKeys。我会使用 ManyToMany,除非用户只被允许一次约会。

【讨论】:

  • else case apt_request = AppointmentRequest() 之后的第一行是什么意思。它应该调用哪个函数?
  • 哦。我想到了。它应该引用模型类实例。事情现在似乎奏效了。但是,我的印象是,这将允许一对多,即 1 个用户进行多次约会。不是这样吗?
  • 是和不是。我想我明白你现在在做什么。目前,您的设计允许多个用户进行一次约会。如果你想让一个用户有很多约会,你应该在 AppointmentRequest 模型上有外键。
【解决方案2】:
    requesting_user = request.GET['requesting_user']

在这部分中,您将用户作为 json 而不是 django 模型实例,因此当您应用时

    update_user = CustomUser.objects.get(username=requested_user)

它没有得到任何东西。

你应该使用 django 序列化器来创建一个 userSerializer,然后在你申请时使用它将 json 用户转换为模型实例

    update_user = CustomUser.objects.get(username=requested_user)

这应该可以。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 2018-06-07
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多