2016-05-05 3 views
0

Можно ли определить отношение внешнего ключа или OneToOne в модели django только с подмножеством данных?Модель Django ForeignKey с подмножеством данных

Например:

У меня есть 2 модели.

@with_author 
    class Product(models.Model): 
     GTIN = models.CharField(max_length=30) 
     material = models.ForeignKey(Material, on_delete=models.PROTECT) 

     UOM = models.OneToOneField(MaterialUOM) 
     defaultPrice = MoneyField(max_digits=10, decimal_places=2, default_currency='USD') 

и

@with_author 
    class UOM(models.Model): 
     uomname = models.CharField(max_length=30) 
     material = models.ForeignKey(Material, on_delete=models.PROTECT) 

так что я хочу в моей модели продукта только, чтобы значения UoM, которые имеют такое же значение, как и в материальной продукции.

Возможно ли это на уровне модели или в любом другом месте и не отображать значения, не относящиеся к выпадающему меню?

ответ

0

Вы можете применить это ограничение, добавив некоторую проверку на модель clean() method. Что-то вроде:

from django.core.exceptions import ValidationError 

class Product(models.Model): 
    GTIN = models.CharField(max_length=30) 
    material = models.ForeignKey(Material, on_delete=models.PROTECT) 

    UOM = models.OneToOneField(MaterialUOM) 
    defaultPrice = MoneyField(max_digits=10, decimal_places=2, default_currency='USD') 

    def clean(self): 
     if not self.material == self.UOM.material: 
      # This will cause the model not to be saved and report an error 
      raise ValidationError('Material does not match UOM material') 

Если вы используете ModelForm для обработки изменений в вашей модели, то clean() будет вызываться автоматически как часть проверки формы. Если вы модифицируете модели непосредственно в своем коде, вам необходимо сначала вызвать его перед сохранением модели. В документации подробно объясняется это.

Если вы хотите быть вдвойне уверенным, вы можете также override the save() method:

def save(self, *args, **kwargs): 
    if not self.material == self.UOM.material: 
     return # Model is not saved 
    super(Product, self).save(*args, **kwargs) 

Это не будет сообщать о любых ошибках - это будет просто не сохранить модель. Следовательно, вы также должны использовать метод clean() выше.

+0

'clean()' метод будет вызван только при сохранении Модели с использованием 'ModelForm', а не иначе. Я думаю, что метод over save лучше использовать для других случаев. И что касается ошибок, вы можете поднять их для этого. – AKS

+0

Это не работает. Я не могу добавить чистый уровень формы, так как у меня нет материала в моей форме, даже если у меня есть его в модели. И когда я добавляю чистую модель, я получаю ошибку. Тип исключения: \t RelatedObjectDoesNotExist Исключительное значение: \t Продукт не имеет материала. –

+0

, даже если я переопределяю уровень сохранения, мое раскрывающееся меню все равно покажет все значения. –

Смежные вопросы