【问题标题】:django signals on inherited profile继承配置文件上的 Django 信号
【发布时间】:2019-03-28 17:33:45
【问题描述】:

我有用户模型,用户可以是类型 1 或 2。 根据创建的用户类型,我想将配置文件与模型相关联。如果输入 1,它将是个人,输入 2 是公司。

我尝试在 models.py 中编写代码并按照教程进行操作:https://simpleisbetterthancomplex.com/tutorial/2016/07/28/how-to-create-django-signals.html

signals/apps/entitiesmodels.py

class CompanyModel(AuditedModel):
    name = models.CharField(max_length=64, db_index=True, verbose_name='Name', null=True, blank=True)

class PersonModel(AuditedModel):   
    name = models.CharField(max_length=64, db_index=True, verbose_name='Name', null=True, blank=True)

class Tester(PersonModel,PersistentModel):
    # Link with user
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, blank=True, related_name='%(class)s_user')

class Company(CompanyModel,PersistentModel):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, blank=True, related_name='%(class)s_user')

signals/apps/entities/signals.py

from django.db.models.signals import post_save
from django.dispatch import receiver          
from django.conf import settings              

from . import models as entities_models       

@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def user_create_profile(sender, instance, created, **kwargs):
    if created:
        if instance.user_type == 1:
            entities_models.Tester.objects.create(user=instance)
        elif instance.user_type == 2:
            entities_models.Company.objects.create(user=instance)
        else:
            pass

信号/应用程序/实体/app.py

from django.apps import AppConfig
class EntitiesConfig(AppConfig):
    name ='entities'

    def ready(self):
        import entities.signals

signals/apps/entities/api_v1/views.py

from signals.apps.entities import models           
from . import serializers                          
from signals.libs.views import APIViewSet          

class PersonViewSet(APIViewSet):                                                             
    queryset = models.Person.objects.all()         
    serializer_class = serializers.PersonSerializer

信号/应用程序/实体/api_v1/urls.py

from rest_framework.routers import DefaultRouter
from signals.apps.entities.api_v1 import views

# Create a router and register our viewsets with it.
app_name='entities'
router = DefaultRouter()
router.register(r'persons', views.PersonViewSet, base_name="entities-persons")
urlpatterns = router.urls

settings.py

LOCAL_APPS = (                                   
    'signals.apps.authentication',               
    'signals.apps.entities.apps.EntitiesConfig', 
)                                                

运行服务器时报错:

 File "/home/gonzalo/Playground/signals3/signals/signals/apps/entities/api_v1/urls.py", line 2, in <module>
   from signals.apps.entities.api_v1 import views
 File "/home/gonzalo/Playground/signals3/signals/signals/apps/entities/api_v1/views.py", line 1, in <module>
   from signals.apps.entities import models
 File "/home/gonzalo/Playground/signals3/signals/signals/apps/entities/models.py", line 47, in <module>
   class Person(PersonModel):
 File "/home/gonzalo/.virtualenvs/signals-test/lib/python3.6/site-packages/django/db/models/base.py", line 108, in __new__
   "INSTALLED_APPS." % (module, name)
untimeError: Model class signals.apps.entities.models.Person doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS

如果有人想查看,我在 github 上有示例代码:https://github.com/gonzaloamadio/django-signals3

【问题讨论】:

  • 您的问题可能与stackoverflow.com/a/29272675/9794932 相同,但如果不通过您的 github 很难确切知道。如果您可以发布出现问题的特定代码片段(即在您的帖子中引用一个最小的损坏示例),那么可能会更容易提供帮助。

标签: python django signals


【解决方案1】:

感谢您的回答,当在设置中使用这种引用应用程序的方式时,您应该像这样使用导入:

signals/apps/entities/api_v1/views.py

from signals.apps.entities import models

在 urls.py 中

from entities.api_v1 import views

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-16
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多