Могу ли я отфильтровать объекты в формах .ManyToManyField с равным значением, выбранным в другом поле? - PullRequest
0 голосов
/ 31 октября 2019

Я хочу установить набор запросов на ManyToManyField, чтобы получить все объекты, для которых ForeignKey равен ForeignKey, установленному в другом поле формы.

class ProductAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(ProductAdminForm, self).__init__(*args, **kwargs)
        self.fields['variants'].queryset = Variant.objects.filter(variantCategory__productCategory__name_single='test')

Это работает, выбирает все значения "Variant", где«name_single» для productCategory в его вариантеCategory равно «test». Я хочу заменить «test» на «name_equal» для productCategory, установленного в этой самой форме.

Вот некоторый код, иллюстрирующий отношение объектов друг к другу.

class Variant(models.Model):
    variantCategory = models.ForeignKey('VariantCategory')

class VariantCategory(models.Model):
    productCategory = models.ForeignKey('ProductCategory')

class ProductCategory(models.Model):
    name_single = models.CharField()

https://imgur.com/a/OLah8at

Здесь показано поле, которое должно определять productCategory равным.

Я понимаю, что это сложно объяснить, если кому-то из вас понадобится дополнительный код / ​​информация, дайте мне знать!

Кроме того, мне просто нужен запрос, чтобы получить все объекты, где productCategory равно другой productCategory. Часть name_equal на самом деле не имеет значения, может быть идентификатором объекта!

1 Ответ

0 голосов
/ 03 ноября 2019

Я думаю, вам следует использовать экземпляр из "формы".

Попробуйте что-то вроде этого.

    def __init__(self, *args, **kwargs):
        super(ProductForm, self).__init__(*args, **kwargs) 
        self.fields['variants'].queryset = Variant.objects.select_related('variantCategory__productCategory').filter(variantCategory__productCategory_id=self.instance.productCategory_id)

Это решение не будет работать, если вы добавите новый продукт, потому что вы выиграли 'У него не должно быть экземпляра (экземпляр будет только в памяти, а не в базе данных), поэтому вы не можете сопоставить foreign_key. Как вы можете видеть, я добавил select_related. Ниже приведен пример хорошей практики

  • не забывайте использовать select_related :

    Variant.objects.select_related('variantCategory__productCategory').filter(variantCategory__productCategory_id=instance.productCategory_id) 
    
  • используйте model_id вместо model.id

    Variant.objects.select_related ('variableCategory__productCategory'). Filter (variableCategory__productCategory_id = instance.productCategory_id)


Если вам нужен запрос, чтобы получить все объекты, гдеproductCategory равно другому продуктуCategory попробуйте это:

myProductCategory = ProductCategory.objects.last()
Product.objects.filter(productCategory__id=myProductCategory.id)  

Дайте мне знать, если это работает:)

...