Django Models Сохранение нескольких полей
Я пытаюсь создать объект в моей модели Order. Мой js возвращает список из нескольких значений для базы данных модели, однако я не могу сохранить несколько значений, которые я получил от ajax в виде списка. Я вижу, что это массив в js и список в django, но этого не происходит. Я пробовал ManyToManyField вместо ForeignKey для поля модели заказа, но это тоже не сработало.
Есть ли способ сохранить несколько значений (список), которые уже являются объектами в других моих моделях?
models.py
from django.db import models
class Car(models.Model):
name = models.CharField(max_length=80)
country = models.CharField(max_length=100)
def __str__(self):
return str(self.name)
class Model(models.Model):
name = models.CharField(max_length=50)
car = models.ForeignKey(Car, on_delete=models.CASCADE)
def __str__(self):
return f"{self.car}-{self.name}"
class Order(models.Model):
car = models.ForeignKey(Car, on_delete=models.CASCADE)
model = models.ForeignKey(Model, on_delete=models.CASCADE)
def __str__(self):
return str(self.pk)
views.py
def create_order(request):
if request.method == 'POST':
print("***", request.POST)
my_car_id = request.POST.get('car')
my_model_id = request.POST.getlist('model[]')
print("***", my_car_id, my_model_id)
print("***", type(my_car_id), type(my_model_id))
car_obj = models.Car.objects.get(id=my_car_id)
model_obj = models.Model.objects.get(id=my_model_id)
print("obj", car_obj, model_obj)
models.Order.objects.create(car=car_obj, model=model_obj)
return JsonResponse({'created':True})
return JsonResponse({'created':False})
html
<form id="car-form">
{% csrf_token %}
<div class="row">
<div class="col">
<label for="cars-data-box">Choose a car</label>
<select style="width: 15rem;" class="form-control" id="cars-data-box">
<option value="---">---</option>
</select>
</div>
<div class="col">
<label for="models-data-box">Choose a model</label>
<select multiple style="width: 15rem;" class="form-control" id="models-data-box">
<option value="---">---</option>
</select>
</div>
<input type="hidden" name="car">
</div>
<div id="button-box" class="row pt-2">
<div class="col">
<button id="submit-form" type="submit" class="btn btn-secondary">Save</button>
</div>
</div>
</form>
js
console.log('main.js working')
var carBox = document.getElementById("cars-data-box")
var modelBox = document.getElementById("models-data-box")
var btn = document.getElementById("submit-form")
var csrf = document.getElementsByName('csrfmiddlewaretoken')
var carForm = document.getElementById('car-form')
var alertBox = document.getElementById('alert-box')
$.ajax({
type: 'GET',
url: '/cars-json/',
success: function(response){
var allCars = response.cars
console.log("all cars:", allCars)
for(var i=0; i< allCars.length; i++){
var carObj = allCars[i];
var carOpt = document.createElement('option');
carOpt.value = carObj.id;
carOpt.innerHTML = carObj.name;
carBox.appendChild(carOpt);
}
},
error: function(error){
console.log(error)
}
})
$(document).ready(function(){
$(carBox).on('change', function(){
var selectedCar = $(this).val();
console.log("selectedCar", selectedCar);
$(modelBox).empty();
$.ajax({
type:'GET',
url:'/models-json/',
success:function(response){
var allModels = response.models
console.log("allModels", allModels)
possibleModels = allModels.filter( merhaba => merhaba.car_id == selectedCar );
console.log("possibleModels", possibleModels);
for(var i=0; i<possibleModels.length; i++){
var modelObj = possibleModels[i];
var modelOpt = document.createElement('option');
modelOpt.value = modelObj.id;
modelOpt.innerHTML = modelObj.name;
modelBox.appendChild(modelOpt);
}
}
})
})
})
carForm.addEventListener('submit', e=>{
e.preventDefault()
console.log('submitted', carBox.value, modelBox.value)
// var selected_models = []
// for(var i of document.getElementById('models-data-box').options){
// if(i.selected_models){
// selected_models.push(i.value)
// }
// }
var selected_models = $(modelBox).val()
console.log("selected_models", selected_models)
$.ajax({
type:'POST',
url:'/create/',
data:{
'csrfmiddlewaretoken':csrf[0].value,
'car':carBox.value,
'model':selected_models,
},
success:function(response){
console.log(response)
},
error:function(error){
console.log(error)
}
})
})
Вам нужно bulk_create вот так:
def create_order(request):
if request.method == 'POST':
# rest of the code
model_objs = models.Model.objects.filter(id__in=my_model_id)
models.Order.objects.bulk_create(
[models.Order(car=car_obj, model=model_obj) for model_obj in model_objs]
)