По умолчанию пользователя в Django (стоимость Sentinel) -- python поле с участием django поле с участием postgresql пол Связанный проблема

Default user in django (sentinel value)


2
vote

проблема

русский

У меня есть модель:

 <код> class NotificationSettings(models.Model):     android_device = models.ForeignKey(         'users.AndroidDevice',         default=None,         null=True,         blank=True,         on_delete=models.SET_NULL     )     user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True)     ...     class Meta:         unique_together = ("user", "android_device")   

Моя проблема заключается в том, что у меня есть Unique_together на полях, которые нуля. Я узнал, что в PostgreSQL (и, как правило, в стандарте SQL) NULL! = NULL, поэтому я могу в конечном итоге, например, двумя объектами уведомлений, которые имеют одинаковое устройство_id, и пользователь нулевой в обоих случаях.

Я думал, что используя <код> NotificationSettings.objects.get_or_create() везде, где я создаю, эти объекты будут достаточно, но я думаю, что есть состояние гонки, когда два запроса попадают в конечную точку практически в то же время, и в любом случае в конце концов ,

Вот почему я хотел сделать это ограничение на уровне PostgreSQL и думал об изменении поля пользователя, чтобы не отнуриться и вместо этого пользователь по умолчанию.

Но я чувствую, что создание пользователей по умолчанию может иметь какие-то последствия безопасности.

Поэтому мой вопрос: это хорошая практика (или практика вообще), чтобы создать такой объект пользователя Sentinel / по умолчанию? Есть ли предостережения / безопасность?

Английский оригинал

I have a model:

class NotificationSettings(models.Model):     android_device = models.ForeignKey(         'users.AndroidDevice',         default=None,         null=True,         blank=True,         on_delete=models.SET_NULL     )     user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True)     ...     class Meta:         unique_together = ("user", "android_device") 

My problem is that I have unique_together on fields that are nullable. I learned that in PostgreSQL (and generally in the SQL standard) NULL != NULL, so I can end up with, for example, two NotificationSettings objects that have the same device_id and user is NULL in both cases.

I thought that using NotificationSettings.objects.get_or_create() everywhere I create these objects would suffice but I guess there is a race condition when two request are hitting the endpoint in almost the same time, and I end up with duplicates anyway.

This is why I wanted to make this constraint on the PostgreSQL level and was thinking about changing the user field to not being nullable and having default user instead.

But I feel like creating default user might have some kind of security consequences.

So my question is: Is this a good practice (or practice at all) to create such a sentinel/default user object? Are there any caveats/security risks?

</div
        

Список ответов

0
 
vote
vote
Лучший ответ
 
<Р> Я просто наткнулся на это в Джанго документы :
 <код> from django.conf import settings from django.contrib.auth import get_user_model from django.db import models  def get_sentinel_user():     return get_user_model().objects.get_or_create(username='deleted')[0]  class MyModel(models.Model):     user = models.ForeignKey(         settings.AUTH_USER_MODEL,         on_delete=models.SET(get_sentinel_user),     )   
<Р> Итак, я предполагаю, что это нормально, чтобы иметь дозорных пользователей в БД.
 

I just stumbled across this in django docs:

from django.conf import settings from django.contrib.auth import get_user_model from django.db import models  def get_sentinel_user():     return get_user_model().objects.get_or_create(username='deleted')[0]  class MyModel(models.Model):     user = models.ForeignKey(         settings.AUTH_USER_MODEL,         on_delete=models.SET(get_sentinel_user),     ) 

So I guess it's OK to have a sentinel users in a DB.

</div
 
 

Связанный проблема

1  Создание метода класса Python с использованием закрытия  ( Creating a python class method using a closure ) 
Я использую модуль unittest unittest module (как я довольно новый python), и я оказываюсь, что вы выполняете те же утверждения испытаний снова и снова. Я х...

25  Найти сломанные симличины с Python  ( Find broken symlinks with python ) 
Если я звоню <код> os.stat() на сломанный <код> 9988777663 , python бросает <код> OSError исключение. Это делает его полезным для их поиска. Тем не менее, е...

52  Как пройти параметры функции при использовании timeit.timer ()  ( How to pass parameters of a function when using timeit timer ) 
Это план простая программа <код> # some pre-defined constants A = 1 B = 2 # function that does something critical def foo(num1, num2): # do something ...

0  Как написать Pivot_Table в TXT файл Python  ( How to write the pivot table to txt file by python ) 
Я получаю pivot_table следующим образом: Есть места в таблице, Что я хочу написать на TXT: Как получить это? <код> WKWebView0 ...

1  Cprofile принимает много памяти  ( Cprofile taking a lot of memory ) 
Я пытаюсь профилировать мой проект в Python, но у меня заканчивается память. Сам мой проект довольно памяти, но даже пробеги полумана с возможностью погибан...

0  Как можно включить против псевдонима в Pyqtgraph ImageView?  ( How can anti aliasing be enabled in a pyqtgraph imageview ) 
Я использую <код> pyqtgraph 's <код> ImageView widget, чтобы отобразить изображение, которое необходимо масштабировать в 1,25 до 1,5, чтобы быть удобным. Эт...

1  Вызов функции Python с параметрами из скрипта оболочки  ( Calling a python function with options from shell script ) 
У меня есть сценарий Python, который принимает различные варианты из командной строки e.g. -Runs с графическим интерфейсом <код> python myscript.py -gui...

2  Создание кафельной карты с блендером  ( Creating a tiled map with blender ) 
Я смотрю на создание плитки карты на основе 3D-модели, сделанной в Blender, карта 16 х 16 в блендере. У меня есть 4 разных уровня зума, и каждая плитка со...

0  Как умножить диагональные элементы друг другом, используя numpy?  ( How to multiply diagonal elements by each other using numpy ) 
Для целей этого упражнения давайте рассмотрим матрицу, где элемент <код> m_{i, j} дается правилом <код> m_{i, j} = i*j Если <код> i == j и <код > 0 else. ...

4  Django на Dreamhost с пассажиром: нет ответа на браузеры, без ошибок  ( Django on dreamhost with passenger no response to browsers no error ) 
Я пытаюсь получить некоторое тривиальное Джанго, чтобы бежать на моей учетной записи Dreamhost. Я сделал свою домашнюю работу, прежде чем выбрать Dreamshost, ...

2  Использование OpenPyXL для поиска ячейки в одном столбце, а затем для распечатки строки для этой соответствующей ячейки  ( Using openpyxl to search for a cell in one column and then to print out the row ) 
Например, я хочу иметь возможность вводить в мою программу через пользователь ввода данных, а затем распечатать ряд, относящуюся к этой ячейке. В идеале, если...

32  Sklearn AgGlomerative Clustering Matrix Matrix  ( Sklearn agglomerative clustering linkage matrix ) 
Я пытаюсь нарисовать полную ссылку <Код> scipy.cluster.hierarchy.dendrogram , и я обнаружил, что <Код> scipy.cluster.hierarchy.linkage медленнее, чем <К...

33  Argparse «Обязательные» необязательные аргументы  ( Argparse compulsory optional arguments ) 
argparse модуль имеет то, что называются «дополнительными» аргументами. Все аргументы, имя которого начинается с <код> - или <код> -- необязательно по умо...

2  Heroku Установить Letsencrypt - SU: ДОЛЖЕН БУДЬТ  ( Heroku install letsencrypt su must be run from a terminal ) 
Я пытаюсь создать сертификат SSL для Мой сайт , чтобы получить зеленый замок. . Во время передачи, как это сделать (никогда не делал ничего с сертификатами ...

0  Python получает глобальные модули вместо местных внутри виртуальны  ( Python is getting global modules instead of local ones inside of virtualenv ) 
Это мой первый раз, используя virtualenv и mysqldb, и я получаю странную ошибку. После того, как я настрою этот Virtualenv, я установил MySQLDB изнутри Virtua...

Связанный проблема

1  Создание метода класса Python с использованием закрытия 
25  Найти сломанные симличины с Python 
52  Как пройти параметры функции при использовании timeit.timer () 
0  Как написать Pivot_Table в TXT файл Python 
1  Cprofile принимает много памяти 
0  Как можно включить против псевдонима в Pyqtgraph ImageView? 
1  Вызов функции Python с параметрами из скрипта оболочки 
2  Создание кафельной карты с блендером 
0  Как умножить диагональные элементы друг другом, используя numpy? 
4  Django на Dreamhost с пассажиром: нет ответа на браузеры, без ошибок 
2  Использование OpenPyXL для поиска ячейки в одном столбце, а затем для распечатки строки для этой соответствующей ячейки 
32  Sklearn AgGlomerative Clustering Matrix Matrix 
33  Argparse «Обязательные» необязательные аргументы 
2  Heroku Установить Letsencrypt - SU: ДОЛЖЕН БУДЬТ 
0  Python получает глобальные модули вместо местных внутри виртуальны 



© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.