Ticket #16317: get_by_natural_key.patch

File get_by_natural_key.patch, 4.5 KB (added by aldaran, 4 years ago)

patch and tests

  • tests/modeltests/fixtures/fixtures/nodes.json

     
     1[
     2    {
     3        "pk": 1,
     4        "model": "fixtures.node",
     5        "fields": {
     6            "code": 7,
     7            "name": "Tree",
     8            "parent": null
     9        }
     10    },
     11    {
     12        "pk": 2,
     13        "model": "fixtures.node",
     14        "fields": {
     15            "code": 3,
     16            "name": "Sequoia",
     17            "parent": [
     18                7,
     19                "Tree"
     20            ]
     21        }
     22    },
     23    {
     24        "pk": 3,
     25        "model": "fixtures.node",
     26        "fields": {
     27            "code": 10,
     28            "name": "Eucalyptus",
     29            "parent": [
     30                7,
     31                "Tree"
     32            ]
     33        }
     34    },
     35    {
     36        "pk": 4,
     37        "model": "fixtures.node",
     38        "fields": {
     39            "code": 16,
     40            "name": "Sequoia sempervirens",
     41            "parent": [
     42                3,
     43                "Sequoia"
     44            ]
     45        }
     46    },
     47    {
     48        "pk": 6,
     49        "model": "fixtures.node",
     50        "fields": {
     51            "code": 17,
     52            "name": "Picea",
     53            "parent": [
     54                7,
     55                "Tree"
     56            ]
     57        }
     58    },
     59    {
     60        "pk": 5,
     61        "model": "fixtures.node",
     62        "fields": {
     63            "code": 6,
     64            "name": "Picea sitchensis",
     65            "parent": [
     66                17,
     67                "Picea"
     68            ]
     69        }
     70    }
     71]
  • tests/modeltests/fixtures/tests.py

     
    77from django.db import connection
    88from django.test import TestCase, TransactionTestCase, skipUnlessDBFeature
    99
    10 from .models import Article, Book, Spy, Tag, Visa
     10from .models import Article, Book, Spy, Tag, Visa, Node
    1111
    1212
    1313class TestCaseFixtureLoadingTests(TestCase):
     
    354354            '<Article: Poker has no place on ESPN>',
    355355            '<Article: Python program becomes self aware>'
    356356        ])
     357
     358class TestCaseNaturalNodeFixtureLoadingTests(TestCase):
     359    fixtures = ['nodes.json',]
     360
     361    def testClassFixtures(self):
     362        "Check that test case has installed 4 fixture objects"
     363        self.assertEqual(Node.objects.count(), 6)
     364        self.assertQuerysetEqual(Node.objects.all(), [
     365            '<Node: 7 (Tree)>',
     366            '<Node: 3 (Sequoia)>',
     367            '<Node: 10 (Eucalyptus)>',
     368            '<Node: 16 (Sequoia sempervirens)>',
     369            '<Node: 6 (Picea sitchensis)>',
     370            '<Node: 17 (Picea)>'
     371        ])
  • tests/modeltests/fixtures/models.py

     
    9797
    9898    class Meta:
    9999        ordering = ('name',)
     100
     101
     102class NodeManager(models.Manager):
     103   
     104    def get_by_natural_key(self, code, name):
     105        return self.get(code=code, name=name)
     106
     107class Node(models.Model):
     108    code = models.IntegerField()
     109    name = models.CharField(max_length=100)
     110    parent = models.ForeignKey('self', null=True)
     111
     112    objects = NodeManager()
     113
     114    def natural_key(self):
     115        return (self.code, self.name)
     116
     117
     118    def __unicode__(self):
     119        return "%s (%s)" % self.natural_key()
  • django/core/management/commands/dumpdata.py

     
    146146            for field in model._meta.fields:
    147147                if hasattr(field.rel, 'to'):
    148148                    rel_model = field.rel.to
    149                     if hasattr(rel_model, 'natural_key'):
     149                    if hasattr(rel_model, 'natural_key') and rel_model != model:
    150150                        deps.append(rel_model)
    151151            for field in model._meta.many_to_many:
    152152                rel_model = field.rel.to
    153                 if hasattr(rel_model, 'natural_key'):
     153                if hasattr(rel_model, 'natural_key') and field.rel.to != model:
    154154                    deps.append(rel_model)
    155155            model_dependencies.append((model, deps))
    156156
Back to Top