使用外键保存序列化程序(django rest 框架)

时间:2021-03-25 10:12:29

标签: javascript django django-rest-framework

我有两个模型,分别是 TaskBatch,它们通过外键字段相互关联。创建 Task Object 时,我想先检查 Batch Object 是否在数据库中可用(批处理只是当前日期,因此我可以使用批处理对每个任务进行分组)。如果没有,则创建一个 Batch 对象,然后将新创建的 Batch 对象传递给正在创建的 Task。

问题是,当我保存数据时,出现错误:

(index):328 POST http://localhost:8000/api/task-create/ 500 (Internal Server Error)

views.py

@api_view(['POST'])
def taskCreate(request):
    batch = Batch.objects.filter(batch = datetime.date.today()).first()
    serializer = TaskSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save(commit=False)
        if batch is None :
            batch = Batch.objects.create(batch = datetime.date.today())
        serializer.batch = batch
        serializer.save()
    return Response(serializer.data)

models.py

class Batch(models.Model):
    batch = models.DateField(auto_now_add=True)
    
    class Meta:
        ordering = ['-batch']
        verbose_name = 'Batch'
        verbose_name_plural = 'Batches'

    def __str__(self):
        return self.batch.strftime("%B %d, %Y %A")

class Task(models.Model):
    title = models.CharField(
            max_length = 256,
        )
    completed = models.BooleanField(
            default =  False,
        )
    batch = models.ForeignKey(Batch, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

serializers.py

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = '__all__'
        depth = 1

这就是我在前端处理表单的方式:

        var form = document.getElementById("form")
        form.addEventListener('submit', function(e){
            e.preventDefault()
            var url = "{% url 'api:task-create' %}"
            if(activeItem != null ){
                url = `http://localhost:8000/api/task-update/${activeItem.id}/`
                activeItem = null
            }
            var title = document.getElementById('title').value
            fetch(url, {

                method: 'POST',
                headers:{
                    'Content-type': 'application/json',
                    'X-CSRFToken': csrftoken,
                },
                body: JSON.stringify({'title':title})
            }).then(function(response){
                renderList()
                document.getElementById('form').reset()
            })
        })

1 个答案:

答案 0 :(得分:0)

更新:自己找到了答案

views.py

@api_view(['POST'])
def taskCreate(request):
    check_batch = Batch.objects.filter(batch = datetime.date.today()).first()
    if check_batch is None:
        check_batch = Batch.objects.create(batch = datetime.date.today())
    serializer = TaskSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save(batch = check_batch)
    return Response(serializer.data)

我使用以下方法访问香草 js 上的前键数据:

${taskList[task].batch.batch}