Django ManyToManyField Проверка уникального набора - PullRequest
0 голосов
/ 13 марта 2020

models.py

class MyProduct(models.Model):
    name = models.CharField()
    codes = models.ManayToManyField(Code)

Привет, я пытаюсь проверить ManyToManyField для уникального набора. он должен подтвердить, что подобный набор не должен повторяться снова для другой записи. В документах django четко указано, что ManyToManyField не может быть unique=True или unique_together. Так как я могу справиться с этой проверкой, я не могу найти решение для этого. Я прошу, пожалуйста, направьте меня для некоторого предложения для этого, это будет полезно для меня. Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 21 марта 2020

Это ссылка на поле массива: https://docs.djangoproject.com/en/3.0/ref/contrib/postgres/fields/

Образцы кодов:
Модель

class Code(models.Model):
id=models.AutoField(primary_key=True)
codevalue=models.CharField(max_length=50)
def __str__(self):
    return f"{self.codevalue}"
from django.contrib.postgres.fields import ArrayField
class MyProduct(models.Model):
      name = models.CharField(max_length=50)
      codes=models.ManyToManyField(Code)
      codesarray = ArrayField(models.CharField(max_length=50, blank=True, 
      null=True),size=8, blank=True, null=True)

форма

class MyProductForm(forms.ModelForm):
    class Meta:
        model=MyProduct
        fields='__all__'

просмотр

from .forms import CodeForm, MyProductForm
from EntityInformation.models import MyProduct
class MyProductView(View):
  template_name = 'EntityInformation/Detail/MyProduct.html'

def get(self, request, name=None):
    myproductform=MyProductForm()
    return render(request, self.template_name, {'form': myproductform})
def post(self,request, name=None):
    myproductform=MyProductForm(request.POST)    
    if myproductform.is_valid():       

        cleaneddata= myproductform.cleaned_data

        arr =[]
        for val in cleaneddata['codes']:
            arr.append(val)        
        try:
            myproductdoc=MyProduct.objects.get(codesarray = arr)
        except:
            myproductdoc=None

        if myproductdoc is None:
            newproductdoc = myproductform.save(commit=False)
            newproductdoc.codesarray=arr
            myproductform.save()
            return render(request, self.template_name, {'form': myproductform})
        else:
            print("Unique validation error")

Приведенный выше код должен помочь вам

0 голосов
/ 20 марта 2020

Используйте модель-посредник, я предпочитаю такой подход, в любом случае он делает вещи очень ясными. https://docs.djangoproject.com/en/3.0/ref/models/fields/#django .db.models.ManyToManyField.through

Вот очень простой c пример рабочего кода.

class Product(models.Model):
    name = models.CharField(max_length=128)
    price = models.DecimalField(max_digits=6, decimal_places=2)

    def __str__(self):
        return self.name


class Customer(models.Model):
    first_name = models.CharField(max_length=128)
    last_name = models.CharField(max_length=128)
    company = models.CharField(max_length=128)
    orders = models.ManyToManyField(
        Product,
        through='Order',
        through_fields=('customer', 'product'),
    )

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


class Order(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

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

    class Meta:
        unique_together = [['product', 'customer']]
0 голосов
/ 20 марта 2020

Я не пробовал это. Но вы можете сохранить поле manytomany в поле массива, если вы используете postgresql. Затем позже вы можете переопределить метод clean_codes, чтобы проверить, доступен ли уже тот же набор массивов.

...