Skip to content
Advertisement

Direct assignment to the forward side of a many-to-many set is prohibited. Use coolbox_id.set() instead. helpme

I am getting this error when i use many to many field help me plsssssss

views.py

def add_ship(request):
    
    if request.method=='POST':
        
        m_namedriver = request.POST.get('m_namedriver')
        driver_id = Driver.objects.get(driver_id=m_namedriver)

        m_licensepl = request.POST.get('m_licensepl')
        car_id = Car.objects.get(car_id=m_licensepl)

        m_weightcoolbox = request.POST.get('m_weightcoolbox')
        coolbox_id = Coolbox.objects.get(coolbox_id=m_weightcoolbox)

        ship_date = request.POST.get('ship_date')
        ship_time = request.POST.get('ship_time')
        original = request.POST.get('original')
        destination = request.POST.get('destination')

        if shipping.objects.count() != 0:
            ship_id_max = shipping.objects.aggregate(Max('shipping_id'))['ship_id__max']
            next_ship_id = ship_id_max[0:2] + str(int(ship_id_max[2:6])+1)
        else:
            next_ship_id = "SP1000"

        new_shipping = shipping.objects.create(
                shipping_id = next_ship_id,
                driver_id = driver_id,
                car_id = car_id,
                coolbox_id = coolbox_id,
                ship_date = ship_date,
                ship_time = ship_time,
                original = original,
                destination = destination,
            )

        new_shipping.save()
        new_shipping.coolbox_id.add(coolbox_id)

        return render(request,'add_ship.html',{'message1':"Add shipping successful."})
    driver_ship = Driver.objects.all()
    car_ship = Car.objects.all()
    coolbox_ship = Coolbox.objects.all()
    return render(request,'add_ship.html',{'driver_ship':driver_ship,'car_ship':car_ship,'coolbox_ship':coolbox_ship})

I’ve been stuck here for 3 days now. At first I used it as a CharField so I could add it, but when I added another ID it couldn’t add it. It says there is a problem in this part ship_id_max = shipping.objects.aggregate(Max(‘shipping_id’))[‘ship_id__max’]

models.py

class Coolbox(models.Model):
    coolbox_id = models.CharField(max_length=40,primary_key=True)
    medicine_name = models.ForeignKey(Medicine, on_delete=models.CASCADE, related_name="medicinename")
    weight = models.FloatField(blank=True, null=True)
    coolboxtemp_max = models.FloatField(blank=True, null=True)
    coolboxtemp_min = models.FloatField(blank=True, null=True)
    dimension = models.CharField(max_length=40)
    d_measurement = models.CharField(max_length=40)
    t_measurement = models.CharField(max_length=40)
    total = models.FloatField(blank=True, null=True)
    status = models.CharField(max_length=20, choices=STATUS, blank=True)

    def __str__(self):
        return f"{self.medicine_name}"




class shipping(models.Model):
    shipping_id = models.CharField(max_length=15,primary_key=True)
    driver_id = models.ForeignKey(Driver, on_delete=models.CASCADE, related_name="driverfk")
    
    car_id = models.ForeignKey(Car, on_delete=models.CASCADE, related_name="carfk")
    coolbox_id = models.ManyToManyField(Coolbox,  related_name="coolboxfk")
    ship_date = models.DateField(blank=True,null=True)
    ship_time = models.TimeField(blank=True,null=True)
    original = models.CharField(max_length=200)
    destination = models.CharField(max_length=200)

    def __str__(self):
        return f"{self.shipping_id}: {self.driver_id}"

enter image description here enter image description here

HTML

<div class="col-md-6 mb-4">
                        <div class="form-outline multip_select_box">
                          <label class="form-label" for="Coolboxs">Coolboxs ID</label>
                          <br>
                          <select name="m_weightcoolbox" id="m_weightcoolbox" class="multi_select form-control"  multiple data-selected-text-format="count > 3" >
                            {% for m_weightcoolbox in coolbox_ship %}
                            
                            <option value="{{ m_weightcoolbox.coolbox_id }}">{{ m_weightcoolbox.coolbox_id }}</option>
                            {% endfor %}
                            
                          </select>
                          
                          

                                                        
                          
                        </div>
      
                      </div>
                    </div>  



enter code here

Help me plsssssssssss

Advertisement

Answer

You need to pass a List of objects of not a single object at save

you can do like this …

def add_ship(request):
    if request.method=='POST':
        
        m_namedriver = request.POST.get('m_namedriver')
        driver_id = Driver.objects.get(driver_id=m_namedriver)

        m_licensepl = request.POST.get('m_licensepl')
        car_id = Car.objects.get(car_id=m_licensepl)

        m_weightcoolbox = request.POST.getlist('m_weightcoolbox')
        print(m_weightcoolbox)
        coolb_id = [i for i in Coolbox.objects.filter(coolbox_id__in=m_weightcoolbox)]
        ship_date = request.POST.get('ship_date')
        ship_time = request.POST.get('ship_time')
        original = request.POST.get('original')
        destination = request.POST.get('destination')

        if shipping.objects.count() != 0:
            ship_id_max = shipping.objects.aggregate(Max('shipping_id'))["shipping_id__max"]
            next_ship_id = ship_id_max[0:2] + str(int(ship_id_max[2:6])+1)
        else:
            next_ship_id = "SP1000"

        new_shipping = shipping.objects.create(
                shipping_id = next_ship_id,
                driver_id = driver_id,
                car_id = car_id,
                ship_date = ship_date,
                ship_time = ship_time,
                original = original,
                destination = destination,
            )
        new_shipping.coolbox_id.set(coolb_id)
        return redirect("add_ship")

        return render(request,'add_ship.html',{'message1':"Add shipping successful."})
    driver_ship = Driver.objects.all()
    car_ship = Car.objects.all()
    coolbox_ship = Coolbox.objects.all()
    return render(request,'add_ship.html',{'driver_ship':driver_ship,'car_ship':car_ship,'coolbox_ship':coolbox_ship})

CODE

https://drive.google.com/file/d/18v_BgTLSmMLhfNCDojhYlTeqkfUsASqt/view?usp=share_link

OUTPUT

after downloading Animatoin.gif file open it in Chrome Browser it’s the full video of working with your project

https://drive.google.com/file/d/1klxwCUb47UI2NimCnSvrqkpc2SB0691S/view?usp=share_link

Advertisement