Глубина DRF только для указанных полей для GET и POSTPython

Программы на Python
Anonymous
Глубина DRF только для указанных полей для GET и POST

Сообщение Anonymous »

Итак, я попробовал это переполнение стека - глубина Django REST Framework только для указанных полей, чтобы указать, какое поле имеет глубину, это работает, но когда я хочу выполнить POST для вставки новой записи, это не могу, потому что это похоже на то, что Джанго считает мое поле обязательным и устанавливает для него значение NULL. Вот мой код...

Код: Выделить всё

../apps/models.py

Код: Выделить всё

class GroupingTypes(models.Model):
grouping_name = models.CharField(max_length=255, unique=True)
description = models.TextField(null=True, blank=True)

class Meta:
db_table = 'grouping_types'

class Templates(models.Model):
id = models.UUIDField(primary_key=True, default=None, editable=False)
...
name = models.CharField(max_length=255, default=None)
grouping = models.ForeignKey(GroupingTypes, on_delete=models.CASCADE)
file = models.FileField(upload_to="templates/")
...

class Meta:
db_table = 'templates'

def delete(self, *args, **kwargs):
if self.file and os.path.isfile(self.file.path):
os.remove(self.file.path)
super().delete(*args, **kwargs)

Код: Выделить всё

../apps/serializers.py

Код: Выделить всё

class GroupingTypesSerializer(serializers.ModelSerializer):
class Meta:
model = GroupingTypes
fields = "__all__"

class TemplatesSerializer(serializers.ModelSerializer):
# Extra fields that's not defined in models
unix_timestamp_added = serializers.SerializerMethodField()
datetime_added = serializers.SerializerMethodField()

def get_unix_timestamp_added(self, obj: Templates):
return int(obj.timestamp_added.timestamp())

def get_datetime_added(self, obj: Templates):
return obj.timestamp_added.strftime("%Y-%m-%d %H:%M:%S")

grouping = GroupingTypesSerializer(read_only=True)

class Meta:
model = Templates
fields = "__all__"
extra_kwargs = {
'file': {'write_only': True}
}

Код: Выделить всё

../apps/views.py

Код: Выделить всё

# `../utils/utils.py`
def post(request: HttpRequest, Serializer: serializers.ModelSerializer):
serializer = Serializer(data=request.data)
if serializer.is_valid():
serializer.save()
print(f"\033[92mPOST\033[0m")
return Response(
{
"success": True,
"msg": "added",
"data": None,
},
status=HTTP_201_CREATED
)
print(f"\033[91mPOST\033[0m")
return Response(
{
"success": False,
"msg": serializer.errors,
"data": None,
},
status=HTTP_400_BAD_REQUEST
)

# -------------------------------------------
# views.py
class TemplatesList(APIView):
def get(self, request: HttpRequest):
...
def post(self. request: HttpRequest):
return utils.utils.post(request, Serializer=TemplatesSerializer)

Код: Выделить всё

../apps/urls.py 

Код: Выделить всё

urlpatterns = [
...
path("template/", TemplatesList.as_view()),
path("template//", TemplatesDetail.as_view()),
...
]
Я пытался отправить POST в обычном формате объекта JSON, но получил сообщение об ошибке:

Код: Выделить всё

django.db.utils.IntegrityError: null value in column "grouping_id" of relation "templates" violates not-null constraint
DETAIL:  Failing row contains (828b0759-0642-4844-abfa-1b5b602a27d2, ..., TEMPLATE-NAME, null, templates/new-template_OQggWfx.xlsx, ...).
Основное сообщение, которое я отправил вот так. Просто нормально:

Код: Выделить всё

{
"id": uuid.uuid4(),
...,
"name": "TEMPLATE-NAME",
"grouping": 7,
"file": InMemoryUploadedFile,
...
}
Для GET и POST все работает нормально. Я удаляю эту строку

Код: Выделить всё

grouping = GroupingTypesSerializer(read_only=True)
Однако при указанной глубине файла он не будет выводиться должным образом.

Подробнее здесь: https://stackoverflow.com/questions/789 ... r-get-post

Вернуться в «Python»