簡體   English   中英

django.db.utils.IntegrityError:唯一約束失敗:mode_setting.user_id

[英]django.db.utils.IntegrityError: UNIQUE constraint failed: mode_setting.user_id

我是 Javascript 的新手,我目前正在學習調試我在控制台中收到的錯誤。

在我的項目中,我為每個登錄網站的用戶添加了一個主題選擇選項。 目前,當我單擊按鈕時它顯示 2 個主題,但它沒有為每個用戶保存主題。

我在我的 Django 項目中創建了一個應用程序,所有內容都在我遵循的教程中進行了介紹,除了在控制台中我每次 select 按鈕主題時都會收到錯誤:

(index):573 POST http://127.0.0.1:8000/update_theme/ 500 (Internal Server Error)

在終端中出現此錯誤:

django.db.utils.IntegrityError: UNIQUE constraint failed: mode_setting.user_id

這是基本模板:

    <link id="mystylesheet" href="{% static 'css/app-light.css' %}" type="text/css" rel="stylesheet">
        <!-- Mode -->
        <div id="mode" class="section" style="padding-top: 1rem; padding-bottom: 3rem;text-align: right">
            <button onclick="swapStyles('app-light.css')" type="button" class="btn btn-secondary">Light Mode</button>
            <button onclick="swapStyles('app-dark.css')" type="button" class="btn btn-dark">Dark Mode</button>
        </div>
        <!-- Mode -->

Javascript

    <script type="text/javascript">

        function getCookie(name) {
            var cookieValue = null;
            if (document.cookie && document.cookie !== '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i < cookies.length; i++) {
                    var cookie = cookies[i].trim();
                    // Does this cookie string begin with the name we want?
                    if (cookie.substring(0, name.length + 1) === (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
            return cookieValue;
        }
        var csrftoken = getCookie('csrftoken');

        var cssFile = "{% static 'css' %}"
        function swapStyles(sheet){
            document.getElementById('mystylesheet').href = cssFile + '/' + sheet
            localStorage.setItem('theme', sheet)

            updateTheme(sheet)
        }
        function loadSettings(){
            //Call data and set local storage

            var url = "{% url 'mode:user_settings' %}"
            fetch(url, {
                method:'GET',
                headers:{
                    'Content-type':'application/json'
                }
            })
            .then((response) => response.json())
            .then(function(data){

                console.log('Data:', data)

                var theme = data.value;

                if (theme == 'light.css' || null){
                    swapStyles('light.css')
                }else if(theme == 'dark.css'){
                    swapStyles('dark.css')
                }
            })
        }
        loadSettings()
        function updateTheme(theme){
            var url = "{% url 'mode:update_theme' %}"
            fetch(url, {
                method:'POST',
                headers:{
                    'Content-type':'application/json',
                    'X-CSRFToken':csrftoken,
                },
                body:JSON.stringify({'theme':theme})
            })
        }
    </script>

這是 model

class Setting(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="mode",null=True,blank=True)
    name = models.CharField(max_length=200, null=True)
    value = models.CharField(max_length=200)

    def __str__(self):
        return self.name

這是views.py


def userSettings(request):
    user = request.user
    setting = getattr(user, 'setting', None)

    if setting:
        seralizer = UserSerailizer(setting, many=False)
        return JsonResponse(seralizer.data, safe=False)
    else:
        return JsonResponse({'message': "User don't have a setting."}, safe=False)


def updateTheme(request):
    data = json.loads(request.body)
    theme = data['theme']

    user=request.user
    setting = Setting.objects.get_or_create(user=user, value=theme, name=user.username)
    setting.save()
    print('Request:', theme)
    return JsonResponse('Updated..', safe=False)

網址.py

app_name = 'mode'


urlpatterns = [
    path('user_settings/', views.userSettings, name="user_settings"),
    path('update_theme/', views.updateTheme, name="update_theme"),
]

序列化程序.py

from .models import *

class UserSerailizer(serializers.ModelSerializer):
    class Meta:
        model = Setting
        fields = '__all__'

我的問題是我收到此錯誤的原因以及如何解決?

您正在使用get_or_create錯誤,因為您正在按所有字段進行過濾並且沒有在數據庫中找到已經存在的實例,這導致 get_or_create 嘗試創建另一個實例

因此,您應該將只需要更新為記錄的默認值的字段移動

setting = Setting.objects.get_or_create(user=user, defaults={'value': theme, 'name'= user.username)

此外

  • user.username存儲為字段是沒有意義的數據重復
  • get_or_create之后調用setting.save()是不必要的,因為您可以使用update_or_create代替

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM