【问题标题】:How can I manually edit a specific attribute in a model through Django Shell?如何通过 Django Shell 手动编辑模型中的特定属性?
【发布时间】:2019-02-28 17:55:15
【问题描述】:

我最近在Store 模型中添加了created_by 属性。由于这会在创建商店时自动获取当前登录用户,因此如果我不手动分配任何用户,该列将永远为空。

class Store(models.Model):
        ...
        created_by = ForeignKey(settings.AUTH_USER_MODEL, related_name='stores_of_created_by', null=True, blank=True)

所以,我想手动分配一个用户。我认为 Django Shell(可以通过 python manage.py shell 触发的东西)将是手动分配用户的好方法。

我很困惑如何在所有商店的特定属性中手动分配用户。到目前为止,我通过以下方式获得了特定用户和所有商店。

from django.contrib.auth.models import User
from boutique.models import Store

stores = Store.objects.all()
user = User.objects.get(username='admin@gmail.com')

之后,我需要遍历所有商店并在所有商店的created_by 中分配用户。我如何在Django Shell 中做到这一点?

【问题讨论】:

    标签: django django-shell


    【解决方案1】:

    试试这个

    from django.contrib.auth.models import User
    from boutique.models import Store
    
    stores = Store.objects.all()
    user = User.objects.get(username='admin@gmail.com')
    for store in stores:
        store.created_by = user
        store.save()

    循环遍历 Store QuerySet 并将 created_by 属性分配给特定的 User 实例(这里是 user


    如果您希望以 created_by 管理员身份创建 Store 对象,请按以下方式更改您的模型,

    from django.contrib.auth.models import User
    
    
    def default_admin():
        return User.objects.get(username='admin@gmail.com')
    
    
    class Store(models.Model):
        created_by = ForeignKey(settings.AUTH_USER_MODEL, related_name='stores_of_created_by', default=default_admin)

    【讨论】:

    • 感谢您的帮助!
    【解决方案2】:

    如果您要更新所有商店,这会更快。 遍历存储从数据库中获取记录并写入更新的记录,导致查询次数至少是数据库中记录数的两倍。

    admin = User.objects.get(username='admin@gmail.com') Store.objects.update(created_by=admin)

    这将在两个查询中更新所有商店。

    【讨论】:

    • 谢谢你的想法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多