【问题标题】:Django extending user modelDjango 扩展用户模型
【发布时间】:2016-10-12 07:26:42
【问题描述】:

我有一个名为 Farmer 的模型,它扩展了“用户”,而且它还有一些附加属性,如出生日期、电话号码等。

如何在 Farmer 模型中使用用户的 first_name、last_name 等属性来引用?或者我可以如何在 Farmer 表的管理界面上显示它们?我不想在我的 Farmer 模型中再次使用 first_name,last_name,因为它是重复的。本质上,Farmer 也是一个具有相同名字和姓氏的用户。

我尝试了以下操作,当我尝试添加新农民时,这给了我"Field 'first_name' doesn't have a default value" 错误。

class Farmer(models.Model):
 user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True) 
 birth_date = models.DateField(auto_now=False)
 address = models.TextField(max_length=500)
 phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.")
 phone_number = models.CharField(validators=[phone_regex], blank=True, max_length=20) # validators should be a list

 #This helps to print in admin interface as e.g. Thomas the farmer, without this in admin interface you see farmer object which is difficult to distinguish
 def __str__(self):
    print(self.user.first_name)              # __unicode__ on Python 2
    return "%s" % (self.user)

我的管理员.py

class UserAdmin(admin.ModelAdmin):
   list_display = ('id','username' ,'email', 'is_active', 'date_joined', 'is_staff','last_login', )

admin.site.unregister(User)
admin.site.register(User, UserAdmin)

admin.site.register(Farmer)

【问题讨论】:

  • 这个错误什么时候发生,在迁移过程中还是在创建一个新的农场主的时候?
  • 创建新农户时,迁移成功。然后我删除了所有现有用户,创建了新的超级用户,然后创建了一个用户。
  • 您在模型中引用的User,是django.contrib.auth.User吗?您是通过 UserAdmin 还是通过 FarmerAdmin 创建新用户?
  • 是的,它是 django.contrib.auth.User。我通过默认 API 点击 rest-auth/registration 创建了一个用户,在管理界面中我尝试创建一个抛出错误的农民。在 Farmer 的管理界面中,我可以看到一个收集所有用户的下拉列表。
  • 你试过我的答案了吗?

标签: django django-models django-admin django-rest-framework


【解决方案1】:

类农民(用户):

这样就可以了

【讨论】:

  • 这实际上从我的管理界面中删除了 Farmer,而是再次提供了指向用户的链接,该链接具有用户和农民的属性。这不是我想要的。
【解决方案2】:

让相关模型出现在列表显示中确实很容易,但需要一些输入。

class FarmerAdmin(admin.ModelAdmin):

    def get_username(self):
        return self.user.username

    def get_is_staff(self):
        return self.user.is_staff

    list_display = (get_username, get_is_staff, .... )

    def get_queryset(self, request):
        return super(FarmerAdmin, self).get_queryset(request).select_related('user')

请注意,需要修改查询集,否则管理列表视图中的每一行都会导致查询。你的__str__ 方法也有同样的效果。

【讨论】:

    猜你喜欢
    • 2011-02-28
    • 2013-12-06
    • 2018-01-21
    • 2018-04-24
    • 2017-03-02
    • 2018-01-22
    • 1970-01-01
    相关资源
    最近更新 更多