首页 > 解决方案 > 如何将一个模型与另一个模型连接两次?

问题描述

我的项目中有两个模型。这将是一个用于向支持人员发送票证的小而简单的应用程序。
第一个模型适用于帖子/票证的作者

class Autor(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, unique=True)
    service_group = models.BooleanField(default=False)
    active = models.BooleanField(default=True)

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

第二是门票。这只是它的一部分,但你会明白我的意思......

class Ticket(models.Model):
    added_date = models.DateField('added date') 
    added_time = models.TimeField('added time')
    topic = models.CharField(max_length=400, unique=False) 
    description = models.TextField() 
    post_author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='post_author')
    status = models.ForeignKey(Status, on_delete=models.CASCADE, default=1)   
    open_date = models.DateField('open date', default='1900-01-01')  
    open_time = models.TimeField('open time', default='00:00') 
    service = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='service') 
    close_date = models.DateField('close date', default='1900-01-01') 
    close_time = models.TimeField('close time', default='00:00')

    def __str__(self):
        return self.topic

但是,这就是模型作者的连接不起作用的原因。

Cannot assign "1": "Ticket.service" must be a "Author" instance.

在这里你有完整的错误信息

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/new_ticket/

Django Version: 3.2.8
Python Version: 3.10.0
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'tickets_system',
 'bootstrapform']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "C:\Users\home\PycharmProjects\tickets_system\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\home\PycharmProjects\tickets_system\venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\home\PycharmProjects\tickets_system\venv\lib\site-packages\django\contrib\auth\decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "C:\Users\home\PycharmProjects\tickets_system\serwis\views.py", line 131, in new_ticket
    form_new_ticket.instance.service = int(service1)
  File "C:\Users\home\PycharmProjects\tickets_system\venv\lib\site-packages\django\db\models\fields\related_descriptors.py", line 215, in __set__
    raise ValueError(

Exception Type: ValueError at /new_ticket/
Exception Value: Cannot assign "1": "Ticket.service" must be a "Author" instance.

和views.py文件...

def get_author(user):
    qs = Autor.objects.filter(user=user)
    if qs.exists():
        return qs[0]
    return None


def new_ticket(request):
    form_new_ticket= TicketForm(request.POST or None, request.FILES or None)

    date_now = datetime.now()
    added_date = date_now.strftime("%Y-%m-%d")
    time_now = timezone.now()
    added_time = time_now.strftime("%H:%M")

    open_date1 = '1900-01-01'
    open_time1 = '00:00'
    service1 = 1
    close_date1 = '1900-01-01'
    close_time1 = '00:00'

    if form_new_ticket.is_valid():
        author = get_author(request.user)
        form_new_ticket.instance.open_date = open_date1 
        form_new_ticket.instance.open_time = open_time1 
        form_new_ticket.instance.service = int(service1)
        form_new_ticket.instance.close_date = close_date1 
        form_new_ticket.instance.close_time = close_time1 
        form_new_ticket.instance.post_author = author
        form_new_ticket.instance.added_date = request.POST.get('added_date')
        form_new_ticket.instance.added_time = request.POST.get('added_time ')
        form_new_ticket.save()
        return redirect(nowe_zgloszenie)

    context = {
        'form_new_ticket': form_new_ticket,
        'added_date': added_date,
        'added_time ': added_time ,
    }
    return render(request, 'tickets_system/form_new_ticket.html', context)

更多细节... 它应该如何工作 Author 模型存储可以创建工单的用户,并在创建新工单时自动添加到工单表中。一些编辑用户拥有额外的“服务”权限。创建工单时,不知道谁将分配给该任务,因此该字段的值应为例如 1。最好为 0,但此值与 Author 表无关。

请帮助我正确连接它以使其工作。

标签: pythondjangodjango-modelsdjango-forms

解决方案


我认为您的错误是在模型票证上放置值 id 而不是实例作者,如果要使用 id,请尝试使用此示例插入带有 id 的服务:

Ticket(service_id="your data id")

或使用像这个例子这样的实例:

get_author = Autor.objects.get(id="author id")
Ticket(service=get_author)

推荐阅读