2017-12-07 2 views
0

Ich habe ein django Modell:"Drehen" Spalten und unique_together

class ShortestRoads2(models.Model): 
    start_node = models.ForeignKey('Nodes', related_name='start_node2', null=True) 
    end_node = models.ForeignKey('Nodes', related_name='end_node2', null=True) 
    map = models.ForeignKey('project.MapProject', null=True) 

    def __str__(self): 
     return str(self.start_node) + ' to ' + str(self.end_node) 

    class Meta: 
     unique_together =(("start_node", "end_node", "map"),) 


class Nodes(models.Model): 
    number = models.IntegerField(null=True, unique=True) 
    geom_node = models.PointField(spatial_index=True) 

Ist es möglich, eine andere unique_together contraint, wobei "start_node" und "end_node" Felder geschaltet werden, zu schaffen?

Erklärt:

obj = ShortestRoads2() 
obj.start_node = Nodes.objects.create(number=x1) 
obj.end_node = Nodes.objects.create(number=x2) 
obj.save() # Object created 

obj2 = ShortestRoads2() 
obj2.start_node = Nodes.objects.create(number=x1) 
obj2.end_node = Nodes.objects.create(number=x2) 
obj2.save() # Raising as expected: IntegrityError 

obj3 = ShortestRoads2() 
obj3.start_node = Nodes.objects.create(number=x2) #Notice varible change 
obj3.end_node = Nodes.objects.create(number=x1) #Notice variable change 
obj3.save() # Object created 

ich eine Ausnahme ausgelöst werden soll, wenn ich spare obj3. Aber wie?

Antwort

0

Ich habe ein Überschreiben von clean() Methode und fragte die Klasse für die anderen Kombinationen, wenn sie es existierte eine IntegrityError

class ShortestRoads2(models.Model): 
    start_node = models.ForeignKey('Nodes', related_name='start_node2', null=True) 
    end_node = models.ForeignKey('Nodes', related_name='end_node2', null=True) 
    map = models.ForeignKey('project.MapProject', null=True) 

    def __str__(self): 
     return str(self.start_node) + ' to ' + str(self.end_node) 

    def clean(self): 
     if ShortestRoads2.objects.filter(start_node=self.end_node, end_node=self.start_node).exists(): 
      raise IntegrityError({'end_node': ['combinations allready exist', ]}) 

    def save(self, *args, **kwargs): 
     self.clean_fields(exclude='length') 
     self.clean() 
     self.validate_unique() 
     super(ShortestRoads2, self).save(*args, **kwargs) 

    class Meta: 
     unique_together =(("start_node", "end_node", "map"),) 
erhöhen würde
Verwandte Themen