Django扩展用户模型

时间:2016-06-11 11:41:27

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

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

如何在Farmer模型中使用诸如first_name,last_name之类的User属性?或者也许我如何在Farmer表中的管理界面上显示它们?我不希望在我的Farmer模型中再次使用first_name,last_name,因为它是重复的。基本上Farmer也是一个拥有相同first_name&的用户。姓。

当我尝试添加新农民时,我尝试了以下操作,这会给我"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)

我的admin.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)

2 个答案:

答案 0 :(得分: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__方法具有相同的效果。

答案 1 :(得分:0)

班级农民(用户):

这将是有效的