Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 16 additions & 3 deletions test_project/generic/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,23 @@ def __str__(self):
@six.python_2_unicode_compatible
class ModelB(models.Model):
name = models.CharField(max_length=64)
a = models.ForeignKey(ModelA, blank=True, null=True, related_name='rel_b')
content_type = models.ForeignKey(ContentType, related_name='+')
a = models.ForeignKey(
ModelA,
blank=True,
null=True,
related_name='rel_b',
on_delete=models.CASCADE,
)
content_type = models.ForeignKey(
ContentType,
related_name='+',
on_delete=models.CASCADE,
)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
content_object = GenericForeignKey(
'content_type',
'object_id',
)

def __str__(self):
return self.name
4 changes: 2 additions & 2 deletions test_project/many_to_many/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def __str__(self):
return self.title

class Meta:
ordering = ('title',)
ordering = ('title', )


@six.python_2_unicode_compatible
Expand All @@ -25,4 +25,4 @@ def __str__(self):
return self.headline

class Meta:
ordering = ('headline',)
ordering = ('headline', )
8 changes: 6 additions & 2 deletions test_project/many_to_one/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,14 @@ def __str__(self):
class Article(models.Model):
headline = models.CharField(max_length=100)
pub_date = models.DateField()
reporter = models.ForeignKey(Reporter, related_name='articles')
reporter = models.ForeignKey(
Reporter,
related_name='articles',
on_delete=models.CASCADE,
)

def __str__(self):
return self.headline

class Meta:
ordering = ('headline',)
ordering = ('headline', )
11 changes: 9 additions & 2 deletions test_project/one_to_one/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,11 @@ def __str__(self):

@six.python_2_unicode_compatible
class Restaurant(models.Model):
place = models.OneToOneField(Place, primary_key=True)
place = models.OneToOneField(
Place,
primary_key=True,
on_delete=models.CASCADE,
)
serves_hot_dogs = models.BooleanField(default=False)
serves_pizza = models.BooleanField(default=False)

Expand All @@ -26,7 +30,10 @@ def __str__(self):

@six.python_2_unicode_compatible
class Waiter(models.Model):
restaurant = models.ForeignKey(Restaurant)
restaurant = models.ForeignKey(
Restaurant,
on_delete=models.CASCADE,
)
name = models.CharField(max_length=50)

def __str__(self):
Expand Down
4 changes: 3 additions & 1 deletion tox.ini
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
[tox]
envlist =
{py27,py36,pypy}-django{18,11}
{py36}-django{20}, {py27,py36,pypy}-django{18,11}
# 1.9 breaks pypy3 hence only testing with 18
# scandir fails to install in pypy3 so skippint for now
# {pypy3}-django{18}


[testenv]
basepython =
py27: python2.7
Expand All @@ -18,6 +19,7 @@ commands =
pip freeze
make check
deps =
django20: django==2.0
django18: django<1.9
django11: django<2
whitelist_externals =
Expand Down
36 changes: 21 additions & 15 deletions url_filter/filtersets/django.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,13 @@
from ..utils import SubClassDict
from .base import BaseModelFilterSet, ModelFilterSetOptions


__all__ = ['ModelFilterSet', 'DjangoModelFilterSetOptions']


GenericForeignKey = None


if 'django.contrib.contenttypes' in settings.INSTALLED_APPS:
from django.contrib.contenttypes.fields import GenericForeignKey


MODEL_FIELD_OVERWRITES = SubClassDict({
models.AutoField: forms.IntegerField(min_value=0),
models.FileField: lambda m: forms.CharField(max_length=m.max_length),
Expand All @@ -39,9 +35,12 @@ class DjangoModelFilterSetOptions(ModelFilterSetOptions):
Flag specifying whether reverse relationships should
be allowed while creating filter sets for children models.
"""

def __init__(self, options=None):
super(DjangoModelFilterSetOptions, self).__init__(options)
self.allow_related_reverse = getattr(options, 'allow_related_reverse', True)
self.allow_related_reverse = getattr(
options, 'allow_related_reverse', True
)


class ModelFilterSet(BaseModelFilterSet):
Expand All @@ -60,10 +59,12 @@ def _get_model_field_names(self):
This is used when ``Meta.fields`` is ``None``
in which case this method returns all model fields.
"""
return list(map(
operator.attrgetter('name'),
self.Meta.model._meta.get_fields()
))
return list(
map(
operator.attrgetter('name'),
self.Meta.model._meta.get_fields(),
)
)

def _get_form_field_for_field(self, field):
"""
Expand Down Expand Up @@ -122,17 +123,22 @@ def _build_filterset_from_related_field(self, field):
Build a :class:`.FilterSet` for a Django relation model field
such as ``ForeignKey``.
"""
return self._build_django_filterset(field, {
'exclude': [field.rel.name],
})
try:
name = field.remote_field.name
except AttributeError:
# django version < 1.9
name = field.rel.name
return self._build_django_filterset(field, {'exclude': [name]})

def _build_filterset_from_reverse_field(self, field):
"""
Build a :class:`.FilterSet` for a Django reverse relation model field.
"""
return self._build_django_filterset(field, {
'exclude': [field.field.name],
})
return self._build_django_filterset(
field, {
'exclude': [field.field.name],
}
)

def _build_django_filterset(self, field, meta_attrs):
m = field.related_model
Expand Down