diff --git a/test_project/generic/models.py b/test_project/generic/models.py index bde5674..409f0cb 100644 --- a/test_project/generic/models.py +++ b/test_project/generic/models.py @@ -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 diff --git a/test_project/many_to_many/models.py b/test_project/many_to_many/models.py index 7c1f513..c22b422 100644 --- a/test_project/many_to_many/models.py +++ b/test_project/many_to_many/models.py @@ -13,7 +13,7 @@ def __str__(self): return self.title class Meta: - ordering = ('title',) + ordering = ('title', ) @six.python_2_unicode_compatible @@ -25,4 +25,4 @@ def __str__(self): return self.headline class Meta: - ordering = ('headline',) + ordering = ('headline', ) diff --git a/test_project/many_to_one/models.py b/test_project/many_to_one/models.py index 9fe69c4..b34dc2d 100644 --- a/test_project/many_to_one/models.py +++ b/test_project/many_to_one/models.py @@ -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', ) diff --git a/test_project/one_to_one/models.py b/test_project/one_to_one/models.py index a2e4377..254d3a6 100644 --- a/test_project/one_to_one/models.py +++ b/test_project/one_to_one/models.py @@ -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) @@ -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): diff --git a/tox.ini b/tox.ini index 3df908f..9908e9e 100644 --- a/tox.ini +++ b/tox.ini @@ -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 @@ -18,6 +19,7 @@ commands = pip freeze make check deps = + django20: django==2.0 django18: django<1.9 django11: django<2 whitelist_externals = diff --git a/url_filter/filtersets/django.py b/url_filter/filtersets/django.py index df4c5f2..0cd00cb 100644 --- a/url_filter/filtersets/django.py +++ b/url_filter/filtersets/django.py @@ -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), @@ -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): @@ -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): """ @@ -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