【问题标题】:Django Rest Framework - Cannot POST because username already existsDjango Rest Framework - 无法发布,因为用户名已经存在
【发布时间】:2021-12-03 04:25:23
【问题描述】:

我正在使用 django rest 框架开发一个基本的 rest api。我的数据库在 MySQL 上。对于其中一个功能,当我尝试发布时,它给了我一个错误,因为已经有一行具有相同的用户名。我已将模型设置为将其所有三个字段都设置为 unique_together。请帮助我了解我哪里出错了,这是我目前所拥有的sn-ps:

models.py:

class VolunteerHours(models.Model):
username = models.OneToOneField(Volunteer, models.DO_NOTHING, db_column='Username', primary_key=True) 
date = models.DateField(db_column='Date') 
hours = models.IntegerField(db_column='Hours')  

class Meta:
    managed = False
    db_table = 'volunteer_hours'
    unique_together = (('username', 'date', 'hours'),)

urls.py:

urlpatterns = [

path('timesheet/', views.TimesheetAPIView.as_view()),]

views.py:

from . import models
from . import serializers
from rest_framework import generics
from rest_framework import mixins

class TimesheetAPIView(generics.GenericAPIView, mixins.CreateModelMixin):
    serializer_class = serializers.VolunteerTimesheetSerializer

    def post(self, request):
        return self.create(request)

serializers.py:

class VolunteerTimesheetSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.VolunteerHours
        fields = '__all__'

我得到的错误是:

 "username": [
        "volunteer hours with this username already exists."
    ]

我想要发生的是,只要日期和时间是唯一的,我就可以使用相同的用户名添加尽可能多的行。这是我的 POST 请求中提交的内容,但它说用户名已经存在,即使日期和时间是唯一的。

请帮忙。

谢谢!

【问题讨论】:

    标签: django django-models django-rest-framework django-views django-serializer


    【解决方案1】:

    您已与 VolunteerHours 和 Volunteers 创建了 OneToOne 关系,这意味着每个关系中只能存在一个。正如@DEEPAK KUMAR 所说,您需要删除 primary_key=True,但您还需要通过 ForeignKey 字段将关系更改为 OneToMany。

    【讨论】:

    • 感谢您的回复!我删除了主键并将关系切换到外键,但现在每当我发布时,似乎 django 添加了一个 ID 字段,它不适用于我的数据库,因为我无法更改它。有什么建议吗?
    • “每个模型只需要一个字段来具有 primary_key=True(显式声明或自动添加)。”所以……不是真的……对不起
    猜你喜欢
    • 1970-01-01
    • 2017-02-26
    • 2010-11-03
    • 2020-05-07
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多