“Django 中的分数类型对象不可 JSON 序列化。”

huangapple go评论54阅读模式
英文:

Django object of type fraction is not json serializable

问题

In your view.py code, you're encountering an error because the Fraction object is not serializable to JSON by default. To fix this issue, you can convert the Fraction object to a format that can be serialized, such as a tuple of its numerator and denominator. Here's the modified code:

from django.http import JsonResponse
from fractions import Fraction

def compute(request):
    a = int(request.POST.get("a"))
    b = int(request.POST.get("b"))
    c = int(request.POST.get("c"))
    det = b * b - 4 * a * c
    rdet = sqrt(det)
    x1 = (-b - rdet) / (2 * a)
    x2 = (-b + rdet) / (2 * a)
    x3 = Fraction(15, 45)
    
    # Convert the Fraction object to a tuple
    x3_tuple = (x3.numerator, x3.denominator)
    
    return JsonResponse({
        "op_result": det,
        "op_result2": x1,
        "op_result3": x2,
        "op_result4": 2 * a,
        "op_result5": -b,
        "op_result6": c,
        "op_result7": x3_tuple  # Send x3 as a tuple
    })

By converting x3 to a tuple (x3_tuple), you should be able to send it as part of the JSON response without encountering the "object of type fraction is not JSON serializable" error.

英文:
from django.http import JsonResponse, HttpResponse
from django.shortcuts import render
from math import sqrt
from fractions import Fraction




def index(request):
	return render(request, 'home/index.html', {})

def multiplication(request):
	return render(request, 'multiplication/multiplication.html', {})


def compute(request):
    a = int(request.POST.get("a"))
    b = int(request.POST.get("b"))
    c = int(request.POST.get("c"))
    det = b*b-4*a*c
    rdet = sqrt(det)
    x1= (-b-rdet)/(2*a)
    x2= (-b+rdet)/(2*a)
    x3= Fraction(15, 45)
    return JsonResponse({"op_result": det, "op_result2": x1, "op_result3": x2, "op_result4": 2*a, "op_result5": -b, "op_result6": c,"op_result7": x3})

in my view.py, I tried to send back to my html, the results of the function fractions through the var x3

x3= Fraction(15, 45) and sent the result with JsonResponse. But I have an error message :

object of type fraction is not json serializable

I do not understand where is the mistake.

Thank you for your help

答案1

得分: 1

Here is the translated content from your provided text:

"无法序列化分数,但可以制作自定义序列化器并在其中传递分子和分母"

from django.http import JsonResponse
from django.views import View
from fractions import Fraction
import json

class FractionEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Fraction):
            return {"numerator": obj.numerator, "denominator": obj.denominator}
        return super().default(obj)

class generate_dummy_energy_usage(View):
    def get(self,request):
        a = 10
        b = 40
        c = 30
        det = b*b-4*a*c
        rdet = sqrt(det)
        x1 = (-b-rdet)/(2*a)
        x2 = (-b+rdet)/(2*a)
        x3 = Fraction(15, 45)
        return JsonResponse({"op_result": det, "op_result2": x1, "op_result3": x2, "op_result4": 2*a, "op_result5": -b, "op_result6": c, "op_result7": x3}, encoder=FractionEncoder)

"这是在JsonResponse中的输出"

"而不是发送分数,只需计算并将其发送为字符串可能是更简单的方法"

英文:

you cannot serialize a fraction but can make a custom serializer and pass numerator and denominator in that

from django.http import JsonResponse
from django.views import View
from fractions import Fraction
import json

class FractionEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Fraction):
            return {"numerator": obj.numerator, "denominator": obj.denominator}
        return super().default(obj)

class generate_dummy_energy_usage(View):
    def get(self,request):
        a = 10
        b = 40
        c = 30
        det = b*b-4*a*c
        rdet = sqrt(det)
        x1 = (-b-rdet)/(2*a)
        x2 = (-b+rdet)/(2*a)
        x3 = Fraction(15, 45)
        return JsonResponse({"op_result": det, "op_result2": x1, "op_result3": x2, "op_result4": 2*a, "op_result5": -b, "op_result6": c, "op_result7": x3}, encoder=FractionEncoder)

<br>
this is output in jsonresponse <br>
“Django 中的分数类型对象不可 JSON 序列化。”

rather than sending as fraction just compute it and send it as string would be a easier approach

“Django 中的分数类型对象不可 JSON 序列化。”

答案2

得分: 0

以下是您提供的JavaScript代码的翻译部分:

document.querySelector("#fetch-call").addEventListener("click", event => {
    event.preventDefault();

    let form = new FormData();

    form.append("a", document.querySelector("#a").value);
    form.append("b", document.querySelector("#b").value);
    form.append("c", document.querySelector("#c").value);

    let csrfTokenValue = document.querySelector('[name=csrfmiddlewaretoken]').value;
    let request = new Request("{% url 'compute' %}", {
        method: 'POST',
        body: form,
        headers: {"X-CSRFToken": csrfTokenValue}
    });
    fetch(request)
        .then(response => response.json())
        .then(result => {
            let resultParagraph = document.querySelector("#operation");
            resultParagraph.innerHTML = "Le discriminant " + "\\(\\Delta\\)" + " =" + result["op_result"];
            MathJax.typeset();

            let resultParagraph2 = document.querySelector("#operation2");
            resultParagraph2.innerHTML = "La solution x1 est :" + "\\(" + result["op_result5"] + "-" + "\\sqrt" + result["op_result"] + "\\over" + result["op_result4"] + "\\)" + " et la solution x2 est :" + "\\(" + result["op_result5"] + "+" + "\\sqrt" + result["op_result"] + "\\over" + result["op_result4"] + "\\)";
            MathJax.typeset();

            let resultParagraph3 = document.querySelector("#operation3");
            resultParagraph3.innerHTML = "la valeur approchée de x1 est: " + result["op_result2"] + " et x2 est :" + result["op_result3"];

            let resultParagraph4 = document.querySelector("#operation4");
            resultParagraph4.innerHTML = "facration " + result["op_result7"];
        })
})

请注意,代码中的特殊字符(如\(``和))以及{% url 'compute' %}`可能需要根据您的项目的实际情况进行适当修改。

英文:
document.querySelector(&quot;#fetch-call&quot;).addEventListener(&quot;click&quot;, event =&gt; {
    event.preventDefault();

    let form = new FormData();

    form.append(&quot;a&quot;, document.querySelector(&quot;#a&quot;).value);
    form.append(&quot;b&quot;, document.querySelector(&quot;#b&quot;).value);
    form.append(&quot;c&quot;, document.querySelector(&quot;#c&quot;).value);

    let csrfTokenValue = document.querySelector(&#39;[name=csrfmiddlewaretoken]&#39;).value;
    let request = new Request(&quot;{% url &#39;compute&#39; %}&quot;, {method: &#39;POST&#39;,
                                                      body: form,
                                                      headers: {&quot;X-CSRFToken&quot;: csrfTokenValue}})
    fetch(request)
        .then(response =&gt; response.json())
        .then(result =&gt; {
            let resultParagraph = document.querySelector(&quot;#operation&quot;);
            resultParagraph.innerHTML =&quot;Le discriminant &quot;+&quot;\\(\\Delta\\)&quot;+&quot; =&quot; + result[&quot;op_result&quot;] ;
            MathJax.typeset();

            let resultParagraph2 = document.querySelector(&quot;#operation2&quot;);
            resultParagraph2.innerHTML =&quot;La solution x1 est :&quot;+&quot;\\(&quot;+result[&quot;op_result5&quot;]+&quot;-&quot;+&quot;\\sqrt&quot;+result[&quot;op_result&quot;]+&quot;\\over&quot;+result[&quot;op_result4&quot;]+&quot;\\)&quot;+&quot; et la solution x2 est :&quot;+&quot;\\(&quot;+result[&quot;op_result5&quot;]+&quot;+&quot;+&quot;\\sqrt&quot;+result[&quot;op_result&quot;]+&quot;\\over&quot;+result[&quot;op_result4&quot;]+&quot;\\)&quot;;
            MathJax.typeset();
            
            let resultParagraph3 = document.querySelector(&quot;#operation3&quot;);
            resultParagraph3.innerHTML =&quot;la valeur approch&#233;e de x1 est: &quot; + result[&quot;op_result2&quot;] + &quot; et x2 est : &quot;+ result[&quot;op_result3&quot;];
            
            let resultParagraph4 = document.querySelector(&quot;#operation4&quot;);
            resultParagraph4.innerHTML =&quot;facration &quot; + result[&quot;op_result7&quot;];
            
                   })
})

huangapple
  • 本文由 发表于 2023年5月6日 18:06:17
  • 转载请务必保留本文链接:https://go.coder-hub.com/76188304.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定