mirror of
https://github.com/graphql-python/graphene-django.git
synced 2024-11-21 17:16:56 +03:00
Not require explicitly set ordering
in DjangoConnectionField
(#1518)
* Revert "feat!: check django model has a default ordering when used in a relay connection (#1495)"
This reverts commit 96c09ac439
.
* Fix assert no warning for pytest>=8
This commit is contained in:
parent
ea45de02ad
commit
6f21dc7a94
|
@ -24,9 +24,6 @@ class Faction(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class Ship(models.Model):
|
class Ship(models.Model):
|
||||||
class Meta:
|
|
||||||
ordering = ["pk"]
|
|
||||||
|
|
||||||
name = models.CharField(max_length=50)
|
name = models.CharField(max_length=50)
|
||||||
faction = models.ForeignKey(Faction, on_delete=models.CASCADE, related_name="ships")
|
faction = models.ForeignKey(Faction, on_delete=models.CASCADE, related_name="ships")
|
||||||
|
|
||||||
|
|
|
@ -101,19 +101,13 @@ class DjangoConnectionField(ConnectionField):
|
||||||
non_null = True
|
non_null = True
|
||||||
assert issubclass(
|
assert issubclass(
|
||||||
_type, DjangoObjectType
|
_type, DjangoObjectType
|
||||||
), "DjangoConnectionField only accepts DjangoObjectType types as underlying type"
|
), "DjangoConnectionField only accepts DjangoObjectType types"
|
||||||
assert _type._meta.connection, "The type {} doesn't have a connection".format(
|
assert _type._meta.connection, "The type {} doesn't have a connection".format(
|
||||||
_type.__name__
|
_type.__name__
|
||||||
)
|
)
|
||||||
connection_type = _type._meta.connection
|
connection_type = _type._meta.connection
|
||||||
if non_null:
|
if non_null:
|
||||||
return NonNull(connection_type)
|
return NonNull(connection_type)
|
||||||
# Since Relay Connections require to have a predictible ordering for pagination,
|
|
||||||
# check on init that the Django model provided has a default ordering declared.
|
|
||||||
model = connection_type._meta.node._meta.model
|
|
||||||
assert (
|
|
||||||
len(getattr(model._meta, "ordering", [])) > 0
|
|
||||||
), f"Django model {model._meta.app_label}.{model.__name__} has to have a default ordering to be used in a Connection."
|
|
||||||
return connection_type
|
return connection_type
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|
|
@ -26,9 +26,6 @@ else:
|
||||||
|
|
||||||
|
|
||||||
class Event(models.Model):
|
class Event(models.Model):
|
||||||
class Meta:
|
|
||||||
ordering = ["pk"]
|
|
||||||
|
|
||||||
name = models.CharField(max_length=50)
|
name = models.CharField(max_length=50)
|
||||||
tags = ArrayField(models.CharField(max_length=50))
|
tags = ArrayField(models.CharField(max_length=50))
|
||||||
tag_ids = ArrayField(models.IntegerField())
|
tag_ids = ArrayField(models.IntegerField())
|
||||||
|
|
|
@ -5,9 +5,6 @@ CHOICES = ((1, "this"), (2, _("that")))
|
||||||
|
|
||||||
|
|
||||||
class Person(models.Model):
|
class Person(models.Model):
|
||||||
class Meta:
|
|
||||||
ordering = ["pk"]
|
|
||||||
|
|
||||||
name = models.CharField(max_length=30)
|
name = models.CharField(max_length=30)
|
||||||
parent = models.ForeignKey(
|
parent = models.ForeignKey(
|
||||||
"self", on_delete=models.CASCADE, null=True, blank=True, related_name="children"
|
"self", on_delete=models.CASCADE, null=True, blank=True, related_name="children"
|
||||||
|
@ -15,9 +12,6 @@ class Person(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class Pet(models.Model):
|
class Pet(models.Model):
|
||||||
class Meta:
|
|
||||||
ordering = ["pk"]
|
|
||||||
|
|
||||||
name = models.CharField(max_length=30)
|
name = models.CharField(max_length=30)
|
||||||
age = models.PositiveIntegerField()
|
age = models.PositiveIntegerField()
|
||||||
owner = models.ForeignKey(
|
owner = models.ForeignKey(
|
||||||
|
@ -37,9 +31,6 @@ class FilmDetails(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class Film(models.Model):
|
class Film(models.Model):
|
||||||
class Meta:
|
|
||||||
ordering = ["pk"]
|
|
||||||
|
|
||||||
genre = models.CharField(
|
genre = models.CharField(
|
||||||
max_length=2,
|
max_length=2,
|
||||||
help_text="Genre",
|
help_text="Genre",
|
||||||
|
@ -55,9 +46,6 @@ class DoeReporterManager(models.Manager):
|
||||||
|
|
||||||
|
|
||||||
class Reporter(models.Model):
|
class Reporter(models.Model):
|
||||||
class Meta:
|
|
||||||
ordering = ["pk"]
|
|
||||||
|
|
||||||
first_name = models.CharField(max_length=30)
|
first_name = models.CharField(max_length=30)
|
||||||
last_name = models.CharField(max_length=30)
|
last_name = models.CharField(max_length=30)
|
||||||
email = models.EmailField()
|
email = models.EmailField()
|
||||||
|
|
|
@ -2,12 +2,11 @@ import datetime
|
||||||
import re
|
import re
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from django.db.models import Count, Model, Prefetch
|
from django.db.models import Count, Prefetch
|
||||||
|
|
||||||
from graphene import List, NonNull, ObjectType, Schema, String
|
from graphene import List, NonNull, ObjectType, Schema, String
|
||||||
from graphene.relay import Node
|
|
||||||
|
|
||||||
from ..fields import DjangoConnectionField, DjangoListField
|
from ..fields import DjangoListField
|
||||||
from ..types import DjangoObjectType
|
from ..types import DjangoObjectType
|
||||||
from .models import (
|
from .models import (
|
||||||
Article as ArticleModel,
|
Article as ArticleModel,
|
||||||
|
@ -717,34 +716,3 @@ class TestDjangoListField:
|
||||||
r'SELECT .* FROM "tests_film" INNER JOIN "tests_film_reporters" .* LEFT OUTER JOIN "tests_filmdetails"',
|
r'SELECT .* FROM "tests_film" INNER JOIN "tests_film_reporters" .* LEFT OUTER JOIN "tests_filmdetails"',
|
||||||
captured.captured_queries[1]["sql"],
|
captured.captured_queries[1]["sql"],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class TestDjangoConnectionField:
|
|
||||||
def test_model_ordering_assertion(self):
|
|
||||||
class Chaos(Model):
|
|
||||||
class Meta:
|
|
||||||
app_label = "test"
|
|
||||||
|
|
||||||
class ChaosType(DjangoObjectType):
|
|
||||||
class Meta:
|
|
||||||
model = Chaos
|
|
||||||
interfaces = (Node,)
|
|
||||||
|
|
||||||
class Query(ObjectType):
|
|
||||||
chaos = DjangoConnectionField(ChaosType)
|
|
||||||
|
|
||||||
with pytest.raises(
|
|
||||||
TypeError,
|
|
||||||
match=r"Django model test\.Chaos has to have a default ordering to be used in a Connection\.",
|
|
||||||
):
|
|
||||||
Schema(query=Query)
|
|
||||||
|
|
||||||
def test_only_django_object_types(self):
|
|
||||||
class Query(ObjectType):
|
|
||||||
something = DjangoConnectionField(String)
|
|
||||||
|
|
||||||
with pytest.raises(
|
|
||||||
TypeError,
|
|
||||||
match="DjangoConnectionField only accepts DjangoObjectType types as underlying type",
|
|
||||||
):
|
|
||||||
Schema(query=Query)
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user