【问题标题】:Foreign key defaults to Auth User in Django在 Django 中,外键默认为 Auth User
【发布时间】:2018-03-02 18:25:46
【问题描述】:

我正在使用Django 1.11

我有一个商业模式。

class Business(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)
    business_type = models.ForeignKey(BusinessType, on_delete=models.CASCADE)

    class Meta:
        verbose_name = 'business'
        verbose_name_plural = 'businesses'
        db_table = 'businesses'

    def __str__(self):
        return self.name

当我运行 python3 manage.py makemigration business 时,它给出了

You are trying to add a non-nullable field 'user' to business without a default;

我想将此字段设置为默认使用登录的用户ID作为外键。

如何使用 Auth 用户 ID 作为用户特定数据记录的默认值?

编辑 2

业务创建视图 views.py

class BusinessCreate(CreateView):
    model = Business
    fields = ['name', 'business_type']

    def get_context_data(self, **kwargs):
        data = super(
            BusinessCreate,
            self
        ).get_context_data(**kwargs)

        if self.request.POST:
            data['business_address'] = BusinessAddressFormSet(self.request.POST)
        else:
            data['business_address'] = BusinessAddressFormSet()
        return data

    def form_valid(self, form):
        context = self.get_context_data()
        business_address = context['business_address']
        with transaction.atomic():
            self.object = form.save()

            if business_address.is_valid():
                business_address.instance = self.object
                business_address.save()

        return super(BusinessCreate, self).form_valid(form)

    def get_success_url(self):
        messages.success(self.request, 'Business Added Successfully')
        return reverse('business:list')

【问题讨论】:

    标签: django django-models django-1.11


    【解决方案1】:

    如果是 ForeignKey,您需要提供默认用户,因为该字段是 non nullable

    user = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
    

    评论后更新

    def form_valid(self, form):
        form.instance.user = self.request.user
        return super(BusinessCreate, self).form_valid(form)
    

    【讨论】:

    • 如果 pk=1 的用户不存在?
    • 我想将默认设置为登录的用户ID
    • 你不能这样做,因为你需要可以在模型中访问的请求变量。
    • @AnujTBE,很荣幸能帮助您。非常感谢。
    【解决方案2】:

    没有办法做到这一点。当前用户仅在 http 请求的上下文中才有意义。迁移不能依赖于这种情况。在视图函数中创建新的 Business 实例时,您必须显式传递当前用户。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-16
    • 2016-05-04
    • 2014-11-27
    • 2021-04-03
    • 1970-01-01
    • 2011-06-14
    • 2017-05-11
    • 2014-07-10
    相关资源
    最近更新 更多