Django REST Framework - 使用信号扩展用户模型的问题

爱路唯安

我是 Django 的新手,想用 OneToOne 字段扩展我的用户模型(似乎是最推荐的),我还有一个 ManyToManyField 是强制性的。下面是我的 models.py :

from django.db import models
from django.contrib.auth.models import User
from django.contrib.postgres.fields import ArrayField
from django.db.models.signals import post_save
from django.dispatch import receiver

class Config_Table(models.Model):

    entity_name = models.TextField(primary_key=True)
    category = models.TextField()
    description = models.TextField(blank=True,default='')

class Profile(models.Model):

    "The Profile of a user with details are stored in this model."

    user = models.OneToOneField(User, on_delete=models.CASCADE, max_length=11)

    # The default username is phone number (Ver. 1.0)

    phone_number = models.TextField(max_length=11,default=user)
    avatar = models.ImageField(default='../Static/1.jpeg')
    GENDER_CHOICES = (
        ('M','Male'),
        ('F','Female'),
    )
    gender = models.CharField(max_length=1,choices=GENDER_CHOICES)
    city = models.TextField(max_length=25)
    description = models.TextField(max_length=2000, blank=True, default='')
    interests = models.ManyToManyField(Config_Table)
    date_of_birth = models.DateField(auto_now_add=True)
    USER_TYPES = (
        ('User','Normal User'),
        ('Leader','Tour Leader'),
        ('Admin','Administrator'),
    )
    user_type = models.TextField(choices=USER_TYPES, default='User')
    join_date = models.DateTimeField(auto_now_add=True)
    official_docs = models.ImageField(default='../Static/1.jpeg')
    group_name = models.TextField(blank=True,default='')
    debit_card_number = models.IntegerField(blank=True, default=0)
    MUSIC_CHOICES = (
        ('Rock','Rock Music'),
        ('Trad','Traditional Music'),
        ('Elec','Electronic Music'),
        ('Clas','Classical Music')
    )
    favorite_music = ArrayField(models.TextField(null=True,default=''),size=2)

使用 shell,我可以成功创建一个用户并分配一个如下所示的配置文件。表“Config_table”已填充一些初始数据:

>>> user = User.objects.create_user(username='12345678900')
>>> test = Profile.objects.create(user=user,gender='M',city='NY',user_type='User',favorite_music=['Trad'])
>>> test.save
<bound method Model.save of <Profile: <django.db.models.query_utils.DeferredAttribute object at 0x7f9f98e8a080>>>
>>> test.interests.add('Ski')
>>> test.save
<bound method Model.save of <Profile: <django.db.models.query_utils.DeferredAttribute object at 0x7f9f98e8a080>>>

现在我想让我的观点更容易一些。所以,我在这里这里发现的我想使用 post_save 信号来创建一个 create_user 方法,该方法用一行完成上述所有操作:

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance,gender=instance.gender,city=instance.city,user_type=instance.user_type,
                               favorite_music=instance.favorite_music)
        Profile.interests.add(instance.interests)


@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

‌但是当我像下面这样尝试时。我得到错误:

user = User.objects.create_user(username='12345678900',gender='M',city='NY',interests='Ski',user_type='User',favorite_music=['Trad'])
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/amir/.virtualenvs/Django/lib/python3.6/site-packages/django/contrib/auth/models.py", line 150, in create_user
    return self._create_user(username, email, password, **extra_fields)
  File "/home/amir/.virtualenvs/Django/lib/python3.6/site-packages/django/contrib/auth/models.py", line 142, in _create_user
    user = self.model(username=username, email=email, **extra_fields)
  File "/home/amir/.virtualenvs/Django/lib/python3.6/site-packages/django/db/models/base.py", line 495, in __init__
    raise TypeError("'%s' is an invalid keyword argument for this function" % kwarg)
TypeError: 'gender' is an invalid keyword argument for this function

似乎我错过了一些非常明显或非常愚蠢的东西。有人可以帮忙吗?我在 Ubuntu 16.04 LTS 上使用带有 Postgres 10.1 和 Python 3.7 的 Django 2.0.2。

编辑:我要执行上述操作的原因是让用户的主键和配置文件的主键相同,而不是像下面这样。以下是我从第一个答案中得到的示例(检查“id”和“user”字段):

>>> serial = ProfileSerializer(sample_profile,many=True)
>>> serial.data
[OrderedDict([('id', 13), ('first_name', ''), ('last_name', ''), ('phone_number', 'App.Profile.user'), ('avatar', '../Static/1.jpeg'), ('gender', 'M'), ('city', 'NY'), ('description', ''), ('date_of_birth', '2018-03-04'), ('user_type', 'User'), ('join_date', '2018-03-04T07:12:38.607959Z'), ('official_docs', '../Static/1.jpeg'), ('group_name', ''), ('debit_card_number', 0), ('favorite_music', ['Trad']), ('user', 18), ('interests', ['Ski'])])]
迈克尔·B

您的问题源于您的post_save信号命名create_user_profile不正确。instance变量是一个django.contrib.auth.models.User实例。Profile具有gender属性的模型,而不是django.contrib.auth.models.User实例。您要做的基本上如下:

from django.contrib.auth.models import User
user = User.objects.get(pk=1)
print(user.gender)   # Does not exist

您已经User通过模型profile下面创建一个扩展模型,但是您试图将User模型视为Profile模型,而事实并非如此。

就我个人而言,在我看来,您最好通过扩展 Django 的AbstractUser. 当您拥有各种不同类型的个人资料时,个人资料是很好的,例如 Facebook、Google、员工等,它们将具有不同的属性。我看到的大部分内容应该足够常见,可以在自定义用户模型上使用:

from django.contrib.auth.models import AbstractUser


class User(AbstractUser):
    USER = 0
    LEADER = 1
    ADMIN = 2
    USER_TYPE_CHOICES = (
        (USER, 'Normal User'),
        (LEADER, 'Tour Leader'),
        (ADMIN, 'Administrator'),
    )
    user_type = models.IntegerField(choices=USER_TYPE_CHOICES, default=User.USER)
    # Your custom stuff here

我建议在开始编写 User 模型之前考虑您的数据库设计。以后会省去很多麻烦。

[题外话]:另外,值得一提的是,我在上面的示例模型中看到了一个主要问题。看来您打算将借记卡号码存储在数据库中。您的应用程序/组织必须遵循PCI DSS(支付应用程序数据安全标准)这不是你想掉以轻心的事情

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Django Rest Framework扩展用户模型,如何创建用户

来自分类Dev

Django Rest Framework中扩展用户模型的补丁方法

来自分类Dev

Django Rest Framework的贯穿模型问题

来自分类Dev

Django Rest Framework,使用多个模型查询

来自分类Dev

Django Rest Framework-扩展现有的用户模型并保存

来自分类Dev

通过在 DRF 中扩展用户模型进行身份验证(Django Rest Framework)

来自分类Dev

Django Rest Framework中有多个模型?

来自分类Dev

Django-Rest Framework多个模型

来自分类Dev

每个用户请求的Django Rest Framework指标

来自分类Dev

Django Rest Framework:request.data问题

来自分类Dev

如何使用Django Rest Framework删除对象

来自分类Dev

使用Django REST Framework的Solr搜索结果

来自分类Dev

使用Django Rest Framework设置iOS Restkit

来自分类Dev

Django REST Framework-CurrentUserDefault使用

来自分类Dev

如何使用Django Rest Framework更新OneToOneField

来自分类Dev

使用Django Rest Framework自动引用嵌套

来自分类Dev

使用 django-rest-framework 的密码哈希?

来自分类Dev

基础:如何在 Django Rest Framework 中使用 PATCH 方法用户模型

来自分类Dev

使用Django REST Framework从多个模型返回结果

来自分类Dev

使用Django-rest-framework获取模型的随机对象

来自分类Dev

使用Django-rest-framework获取模型的随机对象

来自分类Dev

如何使用Django REST Framework保存嵌套的Backbone模型

来自分类Dev

Django Rest Framework and JSONField

来自分类Dev

Django Rest Framework API

来自分类Dev

Django Rest Framework的ModuleNotFoundError

来自分类Dev

使用django-rest-framework自动“由用户创建”字段?

来自分类Dev

使用Nginx和Django Rest Framework的身份验证问题

来自分类Dev

使用Django REST Framework作为Django的身份验证后端

来自分类Dev

在Django Rest Framework中注册用户并为用户设置组

Related 相关文章

  1. 1

    Django Rest Framework扩展用户模型,如何创建用户

  2. 2

    Django Rest Framework中扩展用户模型的补丁方法

  3. 3

    Django Rest Framework的贯穿模型问题

  4. 4

    Django Rest Framework,使用多个模型查询

  5. 5

    Django Rest Framework-扩展现有的用户模型并保存

  6. 6

    通过在 DRF 中扩展用户模型进行身份验证(Django Rest Framework)

  7. 7

    Django Rest Framework中有多个模型?

  8. 8

    Django-Rest Framework多个模型

  9. 9

    每个用户请求的Django Rest Framework指标

  10. 10

    Django Rest Framework:request.data问题

  11. 11

    如何使用Django Rest Framework删除对象

  12. 12

    使用Django REST Framework的Solr搜索结果

  13. 13

    使用Django Rest Framework设置iOS Restkit

  14. 14

    Django REST Framework-CurrentUserDefault使用

  15. 15

    如何使用Django Rest Framework更新OneToOneField

  16. 16

    使用Django Rest Framework自动引用嵌套

  17. 17

    使用 django-rest-framework 的密码哈希?

  18. 18

    基础:如何在 Django Rest Framework 中使用 PATCH 方法用户模型

  19. 19

    使用Django REST Framework从多个模型返回结果

  20. 20

    使用Django-rest-framework获取模型的随机对象

  21. 21

    使用Django-rest-framework获取模型的随机对象

  22. 22

    如何使用Django REST Framework保存嵌套的Backbone模型

  23. 23

    Django Rest Framework and JSONField

  24. 24

    Django Rest Framework API

  25. 25

    Django Rest Framework的ModuleNotFoundError

  26. 26

    使用django-rest-framework自动“由用户创建”字段?

  27. 27

    使用Nginx和Django Rest Framework的身份验证问题

  28. 28

    使用Django REST Framework作为Django的身份验证后端

  29. 29

    在Django Rest Framework中注册用户并为用户设置组

热门标签

归档