Django REST: Создайте объект модели с полем user в качестве текущего пользователя
У меня есть модель документа, в которой есть поле user в качестве ForeignKey. Я пытаюсь реализовать две очень общие функции:
- пользователь создает новый документ сCredentials=True; документ, конечно, будет иметь владельца как пользователь, который его создал .
- пользователь может позже получить все документы, владельцем которых является он сам
Вот мой текущий код. Я предполагаю, что я правильно указал поля модели, поскольку я могу видеть поле User как выпадающее меню в панели администратора. Однако я не уверен, какую часть (бэкенд или фронтенд) мне нужно изменить, чтобы позволить фронтенду сделать запрос AXIOS POST.
БЭКЕНД (DJANGO REST FRAMEWORK)
models.py
class Document(models.Model):
id = HashidAutoField(primary_key=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)
title = models.CharField(max_length=100, default="Untitled")
template = models.CharField(max_length=100, default="")
editorState = models.JSONField(default=[])
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True)
serializers.py
class DocumentSerializer(serializers.ModelSerializer):
id = HashidSerializerCharField(source_field="documents.Document.id", read_only=True)
question_blocks = QuestionBlockSerializer(many=True)
outline_blocks = OutlineBlockSerializer(many=True)
mysource = MySourceSerializer(many=True)
user = serializers.PrimaryKeyRelatedField(
read_only=True, default=serializers.CurrentUserDefault()
)
class Meta:
model = Document
fields = "__all__"
def create(self, validated_data):
question_blocks = validated_data.pop("question_blocks")
outline_blocks = validated_data.pop("outline_blocks")
document = Document.objects.create(**validated_data)
for qBlock in question_blocks:
QuestionBlock.objects.create(document=document, **qBlock)
for oBlock in outline_blocks:
OutlineBlock.objects.create(document=document, **oBlock)
document.save()
return document
FRONTEND (REACT)
export const createDocTemp = ({
router,
title,
templateId,
question_blocks,
outline_blocks,
}: NewDocument) => {
const data = {
user =====================================> what should go here?
title,
templateId,
question_blocks,
outline_blocks,
};
console.log(data);
axios({
method: 'post',
url: `${process.env.NEXT_PUBLIC_API_URL}/api/v1/documents/`,
headers: { 'Content-Type': 'application/json' },
data,
withCredentials: true,
})
.then(function (response) {
if (response.status === 201) {
router.push(`/draft/${response.data.id}/`);
}
})
.catch(function (error) {
console.log(error.toJSON());
});
};
Несмотря на то, что я установил поле пользователя как not-required, я постоянно получаю 400 ошибку для функции выше. Я не могу увидеть точное сообщение об ошибке, так как не смог воспроизвести часть "withCredentials" в своем postman.
в сериализаторах вы отправляете id пользователя
const data = {
user =====================================> ID (1,22,44,etc) of user
title,
templateId,
question_blocks,
outline_blocks,
};
Во-вторых, необходимо удалить два параметра read_only из DocumentSerializer