Search code examples
djangouniquemodelsdigital-signaturedjango-signals

Django - Unique model data


For example:

class CarImage(models.Model):
    image = models.ForeignKey(Image)
    car = models.ForeignKey(Car)
    message = models.TextField()


message = 'awesome car'
for image in Image.objects.all():
    for car in Car.objects.all():
        if not CarImage.objects.filter(
            Q(image=image), 
            Q(car=car), 
            Q(message=message),
            ):
            carimage = CarImage()
            carimage.image = image
            carimage.car = car
            carimage.message = message
            carimage.save()

Is there a more efficient way to create unique models based on multiple fields? Would a signature field make this better? Or would Django Signals fix the problem - whenever Car, Image, message is created send signal to create CarImage?


Solution

  • You can add unique_together constraint in CarImage model Meta.

    Sets of field names that, taken together, must be unique.

    Django will ensure that whenever you create a CarImage object, set of image, car and message fields taken together are unique.

    class CarImage(models.Model):
        image = models.ForeignKey(Image)
        car = models.ForeignKey(Car)
        message = models.TextField()
    
        class Meta:
            unique_together = (('image', 'car', 'message'),) # define unique_together constraint