AttributeError: module 'apps.reservations.models.Guest' has no attribute '_meta'

0

Próbuję wydobyć atrybut pola modelu, ale oczywiście mam ścianę. Próbując zrobić to w shellu, wszystko jest okej screenshot-20200726190055.png.
Natomiast kiedy odpalam testy dostaję błąd AttributeError: module 'apps.reservations.models.Guest' has no attribute '_meta'

Kod, którego dotyczy cała zagwozdka

from faker import Faker
 
from apps.reservations.models import Guest
 
fake = Faker()
fake_profile = fake.simple_profile()
 
 
class TestingFactory():
 
    [...]
 
    def guest_factory(self):
        COMMENT_MAX_LENGTH = Guest._meta.get_field('comment').max_length # TU JEST PROBLEM
 
        guest, _ = Guest.objects.get_or_create(
            first_name=fake_profile['name'][0],
            last_name=fake_profile['name'][1],
            sex=fake_profile['sex'],
            birth_date=fake_profile['birth_date'],
            nationality=fake.country_code(),
            passport_number='AEO123456',
            phone_number='+48123456789',
            email=fake_profile['mail'],
            comment=fake.text(max_nb_chars=COMMENT_MAX_LENGTH)
        )
 
        return guest

Co ciekawe, zorientowałem się, że kiedy próbuję hardkodować tę wartość to dostaję jeszcze inny error AttributeError: module 'apps.reservations.models.Guest' has no attribute 'objects'

0
  1. Zacząłbym do tego że pola _X w pythonie z konwencji uważa sie za prywatne i nie powinieneś ich dotykać bo API może się zmienić i mogą zniknąć.
    2 .Odpalasz to tym samym interpreterem?
  2. Zgaduje że to pole jest jakos monkey-patchowane kiedy moduł się inicjalizuje i z jakiegoś powodu dzieje się to inaczej w obu przypadkach. Możliwe że gdzieś w tym module jakoś dziwnie wykrywają czy moduł jest importowany czy uruchamiany i jakieś operacje nie są triggerowane.
0

@Shalom:

pola _X w pythonie z konwencji uważa sie za prywatne i nie powinieneś ich dotykać

no wiem, ale chcę tylko dostać się do tej wartości, żeby nie hardkodować. nie sądzę, żeby w najbliższym stuleciu się to zmieniło.

Odpalasz to tym samym interpreterem

wszystko jest postawione na dockerze

Co do drugiego punktu, to nic nie zrozumialem 😂

0

Jak to odpalasz? W sensie to TestingFactory, przez Django testy? Bo jeśli nie odpalasz ani django serwera ani shella itd. to raczej tego tam nie będziesz miał

0

@anonimowy: wszystko stoi na dockerze, więc serwer mam włączony non stop.
może po prostu podrzucę repo https://github.com/SewerynPiorkowski/SHotel

0

Okej, odświeżam temat bo jest pewien postęp.

from django.contrib.auth import get_user_model

from faker import Faker

# from apps.reservations.models import Guest

User = get_user_model()
fake = Faker()
fake_profile = fake.simple_profile()


class TestingFactory():

    def user_factory(self):
        user, _ = User.objects.get_or_create(
            username=fake_profile['username'],
            email=fake_profile['mail'],
            first_name=fake_profile['name'][0],
            last_name=fake_profile['name'][1],
            sex=fake_profile['sex'],
            birth_date=fake_profile['birthdate'],
            phone_number='+48123456789',
            passport_number='AEO123456'
        )

        return user

    def guest_factory(self, model):
        COMMENT_MAX_LENGTH = model._meta.get_field('comment').max_length

        guest, _ = model.objects.get_or_create(
            first_name=fake_profile['name'][0],
            last_name=fake_profile['name'][1],
            sex=fake_profile['sex'],
            birth_date=fake_profile['birthdate'],
            nationality=fake.country_code(),
            passport_number='AEO123456',
            phone_number='+48123456789',
            email=fake_profile['mail'],
            comment=fake.text(max_nb_chars=COMMENT_MAX_LENGTH)
        )

        return guest

Do metody guest_factory przekazałem model i działa tak jak powinno, aczkolwiek chciałbym tego uniknąć.

0

Po co w ogóle chcesz to osiągnąć? Bo max_length jest przetestowany przez Django, nie lepiej wstawić tu losową zawartość nie oglądając się na max_length?

1 użytkowników online, w tym zalogowanych: 0, gości: 1