Избегайте повторяющихся записей для одного поля - PullRequest
0 голосов
/ 26 марта 2020

У меня есть модель choice в django. который имеет отношение внешнего ключа с моделью user и моделью items. Каждый пользователь может выбрать столько элементов, сколько он хочет, из модели items, модель choice будет отслеживать, сколько пользователей выбрали какие элементы. конкретный пользователь может выбрать элемент только один раз, но моя проблема в том, что когда user1 выбирает какой-либо элемент, другой пользователь не может выбрать его снова.

это мой код для выбора заполнения.

Views.py

def choice_fill(request, cid):
    item_list = item.objects.all()
    title = "Choice Filling"
    page = "Choice Filling"
    if request.method == "POST":
        usr = user.objects.get(id=request.session['id'])
        # return render(request, 'success.html',{'stud':stud})
        if usr.isactive != 1:
            messages.error(request, "Your registration process is incomplete.")
        else:
            if not choice.objects.filter(item_id_id=cid, isactive=1).exists():
                userid = usr.id
                c = choice(user_id_id=studid, item_id_id=cid, isactive=1)
                c.save()
            else:
                return HttpResponse('multiple Entry not allowed')

models.py

class user(models.Model):
    fullname = models.CharField(max_length=50)
    password = models.CharField(max_length=10)
    email = models.EmailField(unique=True)

class item(models.Model):
    name = models.CharField(max_length=50)
    item_code = models.IntegerField(unique=True)

class choice(models.Model):
    user_id = models.ForeignKey(user, on_delete=models.CASCADE)
    item_id = models.ForeignKey(item, on_delete=models.CASCADE)
    created_at = models.DateTimeField(default=timezone.datetime.now())
    updated_at = models.DateTimeField(default=timezone.datetime.now())
    isactive = models.BooleanField()

Ответы [ 2 ]

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

Вы допустили ошибку, что item_id не является внешним ключом, а является ManyToManyField. Вот документы Django Отношение ко многим ко многим

Поэтому измените его на

item_id = models.ManyToManyField(item, blank=False)
0 голосов
/ 26 марта 2020

Вам нужно отфильтровать варианты выбора с теми, с которыми связан пользователь:

if not usr.choice_set.filter(item_id_id=cid, isactive=1).exists():

Вы также должны добавить unique_together в user_id и item_id, чтобы избежать дублирования в самой базе данных как добавленный уровень защиты.

class choice(models.Model):
    user_id = models.ForeignKey(user, on_delete=models.CASCADE)
    item_id = models.ForeignKey(item, on_delete=models.CASCADE)
    created_at = models.DateTimeField(default=timezone.datetime.now())
    updated_at = models.DateTimeField(default=timezone.datetime.now())
    isactive = models.BooleanField()

    class Meta:
        unique_together = [('user_id', 'item_id')]

Наконец, вам действительно следует назвать choice как Choice, а свойства user_id и item_id - user и item. Как правило, имеет смысл использовать choice_instance.user.username, чем choice_instance.user_id.username.

...