【问题标题】:How to override a default value with other value django models如何用其他值 django 模型覆盖默认值
【发布时间】:2021-07-27 10:21:07
【问题描述】:

我对 django 有疑问。在我的模型中,我有一个 JSON 字段,它默认存储一个空列表。当尝试将值附加到该列表时,这不起作用。无论它是另一个对象还是字符串。去田野,那时还是空的。我将不胜感激任何帮助。提前致谢。

models.py

followers = models.JSONField(default={
    "followers": []
})

(“关注者”字段在客户端类中)

views.py

current_user = Client.objects.get(id=response.user.id)
current_user.followers["followers"].append("Some Name")

【问题讨论】:

  • 你调用current_user.save()方法了吗?
  • 您不应该使用字典 object 作为默认值,因为这样所有新构造的项目都将引用 same 字典。
  • 天哪,那是错误。对不起哈哈这很容易xD

标签: python django django-models


【解决方案1】:

这里有两个问题。首先,您需要将对象保存到数据库中。此外,使用{"followers": []} 作为默认值不是 一个好主意。作为documentation on the JSONField says

如果您为该字段提供默认值,请确保它是 可调用的,例如 dict(对于空默认值)或返回 dict 的可调用(例如一个函数)。 错误地使用 default={} 会创建一个可变的默认值,该默认值在所有 JSONField 实例之间共享

因此,您应该定义一个将创建(新)字典的函数,例如:

def default_followers():
    return {'followers': []}

class MyModel(models.Model):
    # …
    followers = models.JSONField(default=default_followers)

如果您想实现追随者-追随者模型,则不应使用 JSONField,而应使用ManyToManyField,因为关系数据库已针对此类表进行了优化,并且可以保证引用完整性。

【讨论】:

  • 首先,非常感谢。真的,这对我帮助很大。我尝试使用 ManyToManyField ,但我必须将它链接到其他类。 “追随者”字段在我的“客户”类中。这是否意味着我必须为其他用户创建一个单独的类,以便 ManyToManyField 可以链接到他们?
  • 你可以创建一个引用另一个模型的ManyToManyField,所以如果你有一个Client,它有一个ManyToManyFieldPoster,那么你就可以创建一个连接表:@987654322 @
猜你喜欢
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
相关资源
最近更新 更多